为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
叮当猫咪 2021-07-01 14:01:21
鉴于这个游乐场:package mainimport "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”从不打印?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我喜欢的方式是这样的go——就像defer——消耗最后一次调用或括号对,在行上,并将无序调用该函数。在此之前的每个调用都是同步的。

在哪里go使调用并发。并defer延迟调用直到当前函数返回。

有这样的一个很好的例子defer部分有效围棋


查看完整回答
反对 回复 2021-07-05
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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")

}

你会看到这样的事情:


oneFunc

Stack of oneFunc: goroutine 1 [running]:

main.oneFunc()

    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:20 +0x118

main.main()

    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x50


Stack of anotherFunc: goroutine 2 [running]:

main.something.anotherFunc()

    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:32 +0xb2

created by main.main

    /tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x69


anotherFunc

堆栈跟踪甚至会告诉您这两个函数在不同的 goroutine 中运行,不需要比较方法调用。


查看完整回答
反对 回复 2021-07-05
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信