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