初始化顺序
先执行import包的每个文件的变量, 然后是init方法, 最后执行main函数, 当main函数执行结束程序退出
一图胜千言函数\变量\结构体 命名
某个名称在包外是否可见,取决于其首个字符是否为大写字母
Go中约定使用驼峰记法 MixedCaps 或 mixedCaps。
由于结构体在大多数地方会被引用, 所以通常是大写开头
接口名
按照约定,只包含一个方法的接口应当以该方法的 名称加上-er后缀 或类似的修饰来构造一个施动着名词,如 Reader、Writer、 Formatter、CloseNotifier 等.
请不要使用I开头作为接口命名 如IRead, IWrite
重新声明与再次赋值
f, err := os.Open(name)
该语句声明了两个变量 f 和 err。在几行之后,又通过
d, err := f.Stat()
注意,尽管两个语句中都出现了 err,但这种重复仍然是合法的:err 在第一条语句中被声明,但在第二条语句中只是被再次赋值罢了
在满足下列条件时,已被声明的变量 v 可出现在:= 声明中:
- 本次声明与已声明的 v 处于同一作用域中(若 v 已在外层作用域中声明过,则此次声明会创建一个新的变量§),
- 在初始化中与其类型相应的值才能赋予 v, 且 在此次声明中至少另有一个变量是新声明的
空白符
若你只需要该遍历中的第二个项(值),请使用空白标识符,即下划线来丢弃第一个值:
for _, value := range array {
sum += value
}
类型选择
使用t.(type)进行类型判断
var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
default:
fmt.Printf("unexpected type %T\n", t) // %T 输出 t 是什么类型
case bool:
fmt.Printf("boolean %t\n", t) // t 是 bool 类型
case int:
fmt.Printf("integer %d\n", t) // t 是 int 类型
case *bool:
fmt.Printf("pointer to boolean %t\n", *t) // t 是 *bool 类型
case *int:
fmt.Printf("pointer to integer %d\n", *t) // t 是 *int 类型
}
make 分配
下面的例子阐明了 new 和 make 之间的区别
var p *[]int = new([]int) // 分配切片结构;*p == nil;基本没用
var v []int = make([]int, 100) // 切片 v 现在引用了一个具有 100 个 int 元素的新数组
// 没必要的复杂:
var p *[]int = new([]int)
*p = make([]int, 100, 100)
// 习惯用法:
v := make([]int, 100)
请记住,make 只适用于映射、切片和信道且不返回指针。若要获得明确的指针, 请使用 new 分配内存。
打印
fmt.Printf("Hello %d\n", 23)
fmt.Fprint(os.Stdout, "Hello ", 23, "\n")
fmt.Println("Hello", 23)
fmt.Println(fmt.Sprint("Hello ", 23))
fmt.Sprintf,字符串函数(Sprintf 等)会返回一个字符串
空白符导入
当一个程序未被直接使用时,可以作为空白符导入
参考资料:
http://go-tour-zh.appspot.com/
网友评论