《Go语言实战》读书笔记

中文版只有240页,如果读者有其他编程语言的基础,那这是很好的一本入门书籍。

第1章:关于 Go 语言的介绍

  • Go 语言是现代的、快速的,带有一个强大的标准库。
  • Go 语言内置对并发的支持。
  • Go 语言使用接口作为代码复用的基础模块。

第2章:快速开始一个 Go 程序

  • 如果需要声明初始值为零值的变量,应该使用 var 关键字声明变量;如果提供确切的非零值初始化变量或者使用函数返回值创建变量,应该使用简化变量声明运算符。
  • 当代码导入了一个包时,程序可以直接访问这个包中任意一个公开的标识符。这些标识符以大写字母开头。以小写字母开头的标识符是不公开的,不能被其他包中的代码直接访问。
  • 在 Go 语言中,所有变量都被初始化为其零值。对于数值类型,零值是 0;对于字符串类型,零值是空字符串;对于布尔类型,零值是 false;对于指针,零值是 nil。对于引用类型来说,所引用的底层数据结构会被初始化为对应的零值。
  • 不仅仅是Go语言,很多语言都允许一个函数返回多个值。一般会像RetrieveFeeds函数这样声明一个函数返回一个值和一个错误值。如果发生了错误,永远不要使用该函数返回的另一个值。这时必须忽略另一个值,否则程序会产生更多的错误,甚至崩溃。
  • 根据经验,如果需要声明初始值为零值的变量,应该使用 var 关键字声明变量;如果提供确切的非零值初始化变量或者使用函数返回值创建变量,应该使用简化变量声明运算符。
  • 使用 sync 包的 WaitGroup 跟踪所有启动的 goroutine。非常推荐使用 WaitGroup 来跟踪 goroutine 的工作是否完成。WaitGroup 是一个计数信号量,我们可以利用它来统计所有的goroutine 是不是都完成了工作。
  • Go 语言中,所有的变量都以值的方式传递。因为指针变量的值是所指向的内存地址,在函数间传递指针变量,是在传递这个地址值,所以依旧被看作以值的方式在传递。
  • 因为有了闭包,函数可以直接访问到那些没有作为参数传入的变量。匿名函数并没有拿到这些变量的副本,而是直接访问外层函数作用域中声明的这些变量本身。因为 matcher 和 feed 变量每次调用时值不相同,所以并没有使用闭包的方式访问这两个变量。
  • goroutine 里面调用了 WaitGroup 的 Wait 方法。这个方法会导致 goroutine阻塞,直到 WaitGroup 内部的计数到达 0。
  • 因为 Go 编译器可以根据赋值运算符右边的值来推导类型,声明常量的时候不需要指定类型。
  • 常量的名称使用小写字母开头,表示它只能在当前包内的代码里直接访问,而不暴露到包外面。
  • 每个字段的声明最后 ` 引号里的部分被称作标记(tag),每个标记将结构类型里字段对应到 JSON 文档里指定名字的字段。
  • 使用关键字 defer 来安排调用 Close 方法,可以保证这个函数一定会被调用。哪怕函数意外崩溃终止,也能保证关键字 defer 安排调用的函数会被执行。关键字 defer 可以缩短打开文件和关闭文件之间间隔的代码行数,有助提高代码可读性,减少错误。
  • Decode 方法接受一个类型为 interface{}的值作为参数。这个类型在 Go 语言里很特殊,一般会配合 reflect 包里提供的反射功能一起使用。
  • 如果接口类型只包含一个方法,那么这个类型的名字以 er 结尾。如果接口类型内部声明了多个方法,其名字需要与其行为关联。
  • 如果要让一个用户定义的类型实现一个接口,这个用户定义的类型要实现接口类型里声明的所有方法。
  • 空结构在创建实例时,不会分配任何内存。这种结构很适合创建没有任何状态的类型。
  • 如果声明函数的时候带有接收者,则意味着声明了一个方法。这个方法会和指定的接收者的类型绑在一起。Search 方法与 defaultMatcher 类型的值绑在一起。这意味着我们可以使用 defaultMatcher 类型的值或者指向这个类型值的指针来调用 Search 方法。
  • 因为大部分方法在被调用后都需要维护接收者的值的状态,所以,一个最佳实践是,将方法的接收者声明为指针。
  • 使用指针作为接收者声明的方法,只能在接口类型的值是一个指针的时候被调用。使用值作为接收者声明的方法,在接口类型的值为值或者指针时,都可以被调用。
  • 程序里所有的 init 方法都会在 main 函数启动前被调用。
  • 我们使用下划线标识符作为别名导入 matchers 包,完成了这个调用。这种方法可以让编译器在导入未被引用的包时不报错,而且依旧会定位到包内的 init 函数。
  • append 这个内置函数会根据切片需要,决定是否要增加切片的长度和容量。这个函数的第一个参数是希望追加到的切片,第二个参数是要追加的值。
  • 使用指针可以在函数间或者 goroutine 间共享数据。

第3章:打包和工具链

猜你喜欢

转载自www.cnblogs.com/CheeseZH/p/11982960.html