Effective go
整理Effective go中的一些杂项
注意到:=虽然是短构造语句,但其左边其实可以有已经定义过的变量,只要满足左边有一个变量是未定义的:=就是合法的,对于已经定义过的变量会进行重新赋值
go里面没有++和--,for循环中的for i:=0;i<n;i++其实是一种宏,也就是说如果有两个迭代变量,就只能这么写了for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 ,同时go也不能用逗号把表达式压在一个for里
switch可以通过逗号分隔的方式合并多个case
1 | func shouldEscape(c byte) bool { |
可以通过给循环或分支结构打标签的方式让break结束特定的循环,比如下方的例子break Loop就是直接结束了外层循环而不是switch
1 | Loop: |
go语言中的new(T)语句返回一个T类型的填充满零值的指针,不同于c/c++中new用于在堆上分配内存,go语言中变量的生命周期由引用维护,也就是用户不需要关心变量所处的位置,从函数中返回局部变量指针也是合法的
与之类似的make只能用于初始化slice,map,channal
go的Array有以下几个特点
Array间的赋值是完全拷贝Array作为参数时也是完全拷贝Array的长度是其类型的一部分,[5]int和[10]int是两种类型
go中的格式化输出方式有fmt.Fprintf fmt.Sprintf fmt.Printf
格式符有以下几种
1 | %d 10进制整数 |
不定长参数可以通过在类型前加...定义,然后在变量后加...解包,不定长变量包本身是一个切片func test(a ...int)
切片在传参时可以用...解包
1 | x := []int{1,2,3} |
枚举类是一系列常量,通常使用iota创建,下面是go创建枚举常量的示例
1 | type ByteSize float64 |
_被称为空白标识符,也就是for循环或函数返回时被用来忽略多余数据的那个下划线,这在go语言中是一种特殊符号,专门用于接收不需要的数据
<-运算符不一定要指定目标,这在传递信号中非常好用
1 | c := make(chan int) // Allocate a channel. |
Effective go