热爱互联网

此贴记录使用Go碰到的一些坑

(1)
第一条不算坑,算做优化吧,对于临时变量应该尽量使用栈空间,所以最好不要去make,但有时候需要使用slice,我们对slice的认知是必须先make才能使用的,其实不然,如下:
var b [5]byte
var bs []byte
bs = b[0:5]
copy(b[0:5], “hello”)
copy(bs, “world”)
其中b是数组,bs是slice。

(2)
这是坑,刚刚哥就被坑了—-莫名的panic,此时可以尝试去删除 GOPATH/pkg/ 目录下对应的.a文件,因为你的包是go get下来的,会自动编译成.a文件,如果后期又更新了代码但.a没有重新生成,那么有可能会出现这个问题。

(3)
这不是坑,深入理解defer语句,注意下面最后一个代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// output: 1
 
package main
 
import (
	"fmt"
)
 
func test() (r int) {
	defer func() {
		r = 1
		return
	}()
	r = 2
	return 3
}
 
func main() {
	r := test()
	fmt.Println(r)
}
 
 
 
// output: 1
 
package main
 
import (
	"fmt"
)
 
func test() (r int) {
	defer func() {
		r = 1
	}()
	r = 2
	return 3
}
 
func main() {
	r := test()
	fmt.Println(r)
}
 
 
 
// output: 1
 
package main
 
import (
	"fmt"
)
 
func test() (r int) {
	defer func() {
		r = 1
	}()
	r = 2
	return r
}
 
func main() {
	r := test()
	fmt.Println(r)
}
 
 
 
// output: 12
 
package main
 
import (
	"fmt"
)
 
func test() (r int) {
	defer func() {
		r += 10
	}()
	r = 2
	return r
}
 
func main() {
	r := test()
	fmt.Println(r)
}
 
 
 
// output: 13
 
package main
 
import (
	"fmt"
)
 
func test() (r int) {
	defer func() {
		r += 10
	}()
	r = 2
	return 3
}
 
func main() {
	r := test()
	fmt.Println(r)
}

2 Comments

Post a Comment

Your email is kept private. Required fields are marked *