摘要:
如果说C++和Java是关于类型层次结构和类型分类的语言,那么Go则是关于组合的语言。 —— Rob Pike,Go语言之父 “偏好组合,正交解耦” 29.1 一切皆组合 在语言设计层面,Go提供了诸多正交的语法元素供后续组合使用,包括: Go语言无类型体系(type hierarchy),类型定义 阅读全文
摘要:
空接口不提供任何信息。 —— Rob Pike,Go语言之父 在函数或方法中使用空接口类型,意味着你没有为编译器提供关于传入实参数据的任何信息, 因此,你将失去静态类型语言类型安全检查的保护屏障,你需要自己检查类似的错误,并且直到运行时才能发现此类错误。 阅读全文
摘要:
接口越大,抽象程度越低 —— Rob Pike,Go语言之父 27.1 Go推荐定义小接口 无论标准库还是社区项目,都遵循了“尽量定义小接口”的建议,方法数量在1~3个范围内的接口占了绝大多数。 27.2 小接口的优势 1.接口越小,抽象程度越高,被接纳度越高 抽象程度越高,对应的集合空间越大。无方 阅读全文
摘要:
接口是Go这门静态语言中唯一“动静兼备”的语言特性 接口的静态特性 接口类型变量具有静态类型,比如:var e error中变量e的静态类型为error 支持在编译阶段的类型检查:当一个接口类型变量被赋值时,编译器会检查右值的类型是否实现了该接口方法集合中的所有方法 接口的动态特性 接口类型变量兼具 阅读全文
摘要:
25.1 什么是变长参数 变长参数函数:调用时可以接受零个、一个或多个实际参数的函数。 func Println(a ...interface{}) (n int, err error) 只能有一个“...T”类型形式参数,且该形式参数应该为函数参数列表中的最后一个形式参数。 “...T”类型形式参 阅读全文
摘要:
24.1 方法集合 方法决定接口实现: 如果某个自定义类型T的方法集合是某个接口类型的方法集合的超集,那么就说类型T实现了该接口,并且类型T的变量可以赋值给该接口类型的变量 Go语言规范,对于非接口类型的自定义类型T: 类型T,方法集合由所有receiver为T类型的方法组成 类型*T,方法集合由所 阅读全文
摘要:
和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。receiver参数是方法与类型之间的纽带。 Go方法特点: 方法名的首字母是否大写决定了该方法是不是导出方法。 方法定义要与类型定义放在同一个包内。由此可以推出,不能为原生类型(如int/float64/ma 阅读全文
摘要:
22.1 defer的运行机制 在Go中,只有在函数和方法内部才能使用defer。 defer关键字后面只能接函数或方法,这些函数被成为deferred函数。defer将它们注册到其所在goroutine用于存放deferred函数的栈数据结构中。 在执行defer的函数退出前,按后进先出(LIFO 阅读全文
摘要:
21.1 什么是"一等公民" (1) 正常创建 // $GOROOT/src/fmt/print.go func newPrinter() *pp { p := ppFree.Get().(*pp) p.panicking = false p.erroring = false p.wrapErrs 阅读全文
摘要:
20.1 认识init函数 init函数的特点: 运行时调用,Go程序中不能显式调用 顺序执行,等待一个init函数执行完毕并返回后再执行下一个init函数 在整个Go程序生命周期内仅会被执行一次 先被传递给Go编译器的源文件中的init函数先被执行,同一个源文件中的多个init函数按声明顺序依次执 阅读全文