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
2
3
4
5
6
7
func shouldEscape(c byte) bool {
switch c {
case ' ', '?', '&', '=', '#', '+', '%':
return true
}
return false
}

可以通过给循环或分支结构打标签的方式让break结束特定的循环,比如下方的例子break Loop就是直接结束了外层循环而不是switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Loop:
for n := 0; n < len(src); n += size {
switch {
case src[n] < sizeOne:
if validateOnly {
break
}
size = 1
update(src[n])

case src[n] < sizeTwo:
if n+1 >= len(src) {
err = errShortInput
break Loop
}
if validateOnly {
break
}
size = 2
update(src[n] + src[n+1]<<shift)
}
}

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
2
3
4
5
6
7
%d 10进制整数
%x 16进制整数
%v value,可以用于打印任何值
%+v 额外打印字段名
%#v 额外打印字段名和类型名
%T 打印类型名
%s String ,输出由该类型的Stringer接口的String()方法实现

不定长参数可以通过在类型前加...定义,然后在变量后加...解包,不定长变量包本身是一个切片
func test(a ...int)
切片在传参时可以用...解包

1
2
3
4
x := []int{1,2,3}
y := []int{4,5,6}
x = append(x, y...)
fmt.Println(x)

枚举类是一系列常量,通常使用iota创建,下面是go创建枚举常量的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
type ByteSize float64

const (
_ = iota // ignore first value by assigning to blank identifier
KB ByteSize = 1 << (10 * iota)
MB
GB
TB
PB
EB
ZB
YB
)

_被称为空白标识符,也就是for循环或函数返回时被用来忽略多余数据的那个下划线,这在go语言中是一种特殊符号,专门用于接收不需要的数据

<-运算符不一定要指定目标,这在传递信号中非常好用

1
2
3
4
5
6
7
8
c := make(chan int)  // Allocate a channel.
// Start the sort in a goroutine; when it completes, signal on the channel.
go func() {
list.Sort()
c <- 1 // Send a signal; value does not matter.
}()
doSomethingForAWhile()
<-c // Wait for sort to finish; discard sent value.
Author

SGSG

Posted on

2025-07-29

Updated on

2025-07-30

Licensed under