一、构造体
1.1 先看下如下的问题,咱们想开一个go协程打印
func TestStruct(t *testing.T) {
type T struct {
I []int
}
var tt = T{I: []int{1, 2, 3, 4, 5}}
go func() {
t.Log(tt.I)
}()
tt.I = nil
time.Sleep(time.Second)
}
func TestStruct1(t *testing.T) {
type T struct {
I []int
}
var tt = T{I: []int{1, 2, 3, 4, 5}}
go func() {
i := tt.I
t.Log(i)
}()
tt.I = []int{}
time.Sleep(time.Second)
}
两个都是输入[]:
[]
[]
和咱们料想的不一样,原以为是输入 [1,2,3,4,5],后果是[],因为tt.I = nil 先执行了。
在go func()之前,能确定是程序执行,但在go func()之后,是没法确定,哪个协程先执行的。
执行程序是未知的。
正确应用办法:
func TestStruct2(t *testing.T) {
type T struct {
I []int
}
var tt = T{I: []int{1, 2, 3, 4, 5}}
i := tt.I
go func() {
t.Log(i)
}()
tt.I = nil
time.Sleep(time.Second)
}
输入:
[1 2 3 4 5]
发表回复