一、结构体
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]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。