slice 与 append 的坑

初始容量被超过了,它会新建一个slice,然后把旧的内容拷贝过去,然后append数据,这就会导致底层数组改变了,期望的结果可能就不是预期的了

1
2
3
4
5
6
7
8
9
10
11
12
13
func Pingpong(s []int) {
s = append(s, 3) // 原来的容量为0,append之后,重新分配了内存地址,s跟原来的slice s已经不是同一个了
}
func main() {
s := make([]int, 0) // 初始化slice s,初始容量为0,长度为0
fmt.Println(s)
Pingpong(s)
fmt.Println(s)
}

输出(两次打印的slice结果都是空):
[]
[]

怎么解决这个问题?答案是增加返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func Pingpong(s []int) []int { // 希望修改slice的,设置返回值,通过返回值去返回数据
s = append(s, 4) // 原来的容量为0,append之后,重新分配了内存地址,s跟原来的slice s已经不是同一个了
return s
}
func main() {
s := make([]int, 0) // 初始化slice s,初始容量为0,长度为0
fmt.Println(s)
s = Pingpong(s) // 这里取出返回值
fmt.Println(s)
}

输出:
[]
[4]

time.Format 的坑

用t.Format(time.ANSIC或者t.Format(“Mon Jan _2 15:04:05 2006”这里不能调整,否则时间差异极大

1
2
3
4
5
6
7
func main() {
t := time.Now()
fmt.Println(t)
}

输出:
2022-07-02 18:28:18.1427377 +0800 CST m=+0.003047101
1
2
3
4
5
6
7
8
// 如果不想要时区等信息,用format
func main() {
t := time.Now()
fmt.Println(t.Format(time.ANSIC))
}

输出:
Sat Jul 2 18:29:34 2022
1
2
3
4
5
6
7
func main() {
t := time.Now()
fmt.Println(t.Format("Mon Jan _2 15:04:05 2006")) // 这里是标准的对比时间,不能改变吗,否则差异很大
}

输出:
Sat Jul 2 18:31:59 2022

range 与闭包的坑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
s := []string{"a", "b", "c"}
for _, v := range s {
go func() { // 通过for range启动goroutine,不用参数传进去的值都是引用闭包的思想
fmt.Println(v) // 这里都是引用了v的地址,v全等于c
}()
}
time.Sleep(3 * time.Second)
}

输出:
c
c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
s := []string{"a", "b", "c"}
for _, v := range s {
go func(v string) { // 通过for range启动goroutine,通过传参的方式进行传值
fmt.Println(v)
}(v)
}
time.Sleep(3 * time.Second)
}

输出:
c
b
a