登录
首页 >  Golang >  Go问答

golang goroutine 同步预期行为

来源:stackoverflow

时间:2024-04-29 23:12:24 417浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《golang goroutine 同步预期行为》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

下面的代码尝试发送到主 goroutine 上的通道并从另一个 goroutine 接收,但有几次它按预期返回,但有几次它退出而不在控制台屏幕上打印任何内容

package main

import "fmt"

func main() {
    ch := make(chan bool)

    go func() {
        data := <-ch
        fmt.printf("received: %t", data)
    }()
    ch <- true
}

同时,下面的代码每次都按预期工作,一个区别是添加了额外的检查来检查通道是否关闭,这总是抛出相同的预期输出。 这是否确保对通道的检查是必须的而不是可选的?或代码有任何问题

package main

import "fmt"

func main() {
    ch := make(chan bool)

    go func() {
        data, ok := <-ch
        if !ok {
            fmt.Println("Channel closed")
            return
        }
        fmt.Printf("Received: %t", data)
    }()
    ch <- true
}

正确答案


在主例程退出之前,您应该等待 goroutine 完成。

package main

import (
    "fmt"
    "sync"
)

func main() {
    ch := make(chan bool)
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        data := <-ch
        fmt.Printf("Received: %t", data)
    }()
    ch <- true
    wg.Wait()
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《golang goroutine 同步预期行为》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>