Go语言实战-2(func、map、goroutine、for range、闭包、const、struct、defer)
变量声明方式
- var
- 如果需要声明初始值为零值的变量,使用var(对于数值类型,零值是0;对于字符串类型,零值是空字符串;对于布尔类型,零值是false;对于指针,零值是nil;对于引用类型,所引用的底层数据结构会被初始化为对应的零值,但是被声明为其零值的引用类型的变量,会返回nil作为其值)
- :=
- 这个是简化变量声明符,用于声明一个变量并且同时给这个变量赋予初始值
- 如果提供确切非零值初始化变量或者使用函数返回值创建变量,使用:=
map
- 声明方式
var matchers = make(map[string]Matcher)
matchers这个变量使用关键字var声明,声明为Matcher类型的映射(map),这个映射以string类型值作为键,Matcher类型作为映射后的值
- 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
- range可以用于迭代数组、字符串、切片、映射和通道。
- 使用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会安排随后的函数调用在函数返回时才执行,即使函数意外崩溃终止,也可以保证安排调用的函数一定会被执行