猿问

链式函数如何作为 goroutine 执行?

鉴于这个游乐场:


package main


import "fmt"


func main() {

    go oneFunc().anotherFunc()

}


func oneFunc() something {

    fmt.Println("oneFunc")

    return something{}

}


type something struct{}


func (s something) anotherFunc() {

    fmt.Println("anotherFunc")

}

为什么是输出:


一个功能


并且“anotherFunc”从不打印?


叮当猫咪
浏览 213回答 3
3回答

呼啦一阵风

我喜欢的方式是这样的go——就像defer——消耗最后一次调用或括号对,在行上,并将无序调用该函数。在此之前的每个调用都是同步的。在哪里go使调用并发。并defer延迟调用直到当前函数返回。有这样的一个很好的例子defer部分的有效围棋

慕盖茨4494581

go计算关键字后面的表达式,然后并发执行该表达式的函数值。因此,在您的示例中oneFunc()被调用,因此oneFunc输出和anotherFunc返回实例上的方法被同时调用。但是,您的程序在 goroutine 可以运行之前终止,这就是为什么您看不到anotherFunc打印的原因。解决方案:使用sync.WaitGroup或通道进行同步。实际上(根据经验)验证您的go调用是否anotherFunc并发执行,而不是 oneFunc您可以在每个函数中打印堆栈并比较输出。示例(在玩):var wg = sync.WaitGroup{}func main() {    wg.Add(1)    go oneFunc().anotherFunc()    wg.Wait()}func oneFunc() something {    fmt.Println("oneFunc")    buf := make([]byte, 4096)    runtime.Stack(buf, false)    fmt.Println("Stack of oneFunc:", string(buf))    return something{}}type something struct{}func (s something) anotherFunc() {    defer wg.Done()    buf := make([]byte, 4096)    runtime.Stack(buf, false)    fmt.Println("Stack of anotherFunc:", string(buf))    fmt.Println("anotherFunc")}你会看到这样的事情:oneFuncStack of oneFunc: goroutine 1 [running]:main.oneFunc()    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:20 +0x118main.main()    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x50Stack of anotherFunc: goroutine 2 [running]:main.something.anotherFunc()    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:32 +0xb2created by main.main    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x69anotherFunc堆栈跟踪甚至会告诉您这两个函数在不同的 goroutine 中运行,不需要比较方法调用。
随时随地看视频慕课网APP

相关分类

Go
我要回答