关于go: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]

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理