go 协程常见问题总结

一、结构体

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]

你可能感兴趣的:(go)