变量声明方式

  1. var
    1. 如果需要声明初始值为零值的变量,使用var(对于数值类型,零值是0;对于字符串类型,零值是空字符串;对于布尔类型,零值是false;对于指针,零值是nil;对于引用类型,所引用的底层数据结构会被初始化为对应的零值,但是被声明为其零值的引用类型的变量,会返回nil作为其值
  2. :=
    1. 这个是简化变量声明符,用于声明一个变量并且同时给这个变量赋予初始值
    2. 如果提供确切非零值初始化变量或者使用函数返回值创建变量,使用:=

map

  1. 声明方式
var matchers = make(map[string]Matcher) 

matchers这个变量使用关键字var声明,声明为Matcher类型的映射(map),这个映射以string类型值作为键,Matcher类型作为映射后的值

  1. map是go语言中的一个引用类型

func

func Run(searchItem string){

}
  • go语言使用关键字func声明函数,func后面紧跟着函数名称、参数以及返回值。对于Run这个函数来说,只有一个参数,名称是searchItem,类型是string。
  • 没有明确声明名字的函数叫做匿名函数,匿名函数也可以接受参数。

方法

如果声明函数的时候带有接收者,则意味着声明了一个方法,这个方法会和指定的接收者的类型绑定在一起

func (m defaultMatcher) Search(feed *Feed, searchItem string) ([]*Result, error) {
	return nil, nil
}

goroutine

  • goroutine是可以与其他goroutine并行执行的函数,同时也会与主程序并行执行。go语言会使用一个线程来执行多个goroutine
  • 在go语言中,如果main函数返回,整个程序也就终止了,也会关闭所有之前启动并且还在运行的goroutine。因此写并发程序的时候,在main函数返回前,清理并终止所有之前启动的goroutine,有助于减少bug。
go func(matcher Matcher, feed *Feed) {
	Match(matcher, feed, searchItem, results)
	waitGroup.Done()
}(matcher, feed)
  • 使用关键字go启动一个goroutine,并对这个goroutine作并发调度

for range

  1. range可以用于迭代数组、字符串、切片、映射和通道。
  2. 使用for range迭代切片时,每次迭代会返回两个值,第一个值是迭代的元素在切片里的索引位置,第二个值是元素值的一个副本。
for _, feed := range feeds{
    ...
}

闭包

const

声明常量,声明常量的时候不需要指定类型,因为Go编译器可以根据赋值运算符右边的值来推导类型

const dataFile = "data/data.json"

struct

type Feed struct {
	Name string `json:"site"`
	URI  string `json:"link"`
	Type string `json:"type"`
}
  • 引号里的部分被称为标记(tag),这个标记描述了JSON解码的元数据,每个标记将结构类型里的字段对应到JSON文档里指定名字的字段。

  • 空结构在创建实例时,不会分配任何内存

defer

关键字defer会安排随后的函数调用在函数返回时才执行,即使函数意外崩溃终止,也可以保证安排调用的函数一定会被执行