突击人
基础
按照约定,包名与导入路径的最后一个元素一致。例如,”math/rand” 包中的源码均以 package rand 语句开始。 调用就 rand.Xxx
连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。
命名返回值:
1 | func split(sum int) (x, y int) { |
var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后。 var a int
函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。
没有明确初始值的变量声明会被赋予它们的零值。
表达式 T(v) 将值 v 转换为类型 T。要显示类型转换。
常量的声明与变量类似,只不过是使用 const 关键字。不能用 :=
1 | for i := 0; i < 10; i++ { |
可以省略一三个语句(及其分号)变为 while。可以全省略变为 while(true)。
在 if 的简短语句中声明的变量同样可以在任何对应的 else 块中使用。
1 | if v := math.Pow(x, n); v < lim { |
go switch 默认 break。
defer 推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
类型 *T 是指向 T 类型值的指针。
1 | type Vertex struct { |
指针访问成员也用点号。
数组 [10]int
。 每个数组的大小都是固定的。而切片则为数组元素提供动态大小的、灵活的视角。在实践中,切片比数组更常用。
类型 []T
表示一个元素类型为 T 的切片。 a[low:high]
左闭右开。切片就像数组的引用。切片用法就像没有长度的数组用法。
切片拥有长度和容量。切片的长度就是它所包含的元素个数。切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。
1 | a := make([]int, 5) // len(a)=5 |
所有给定类型的方法都应该有值或指针接收者,但并不应该二者混用。
即便接口内的具体值为 nil,方法仍然会被 nil 接收者调用。
为了判断一个接口值是否保存了一个特定的类型,类型断言可返回两个值:其底层值以及一个报告断言是否成功的布尔值。