欢迎光临
我们一直在努力

go语言channel简单例子理解

无缓冲channel执行的顺序

package main
import "fmt"
func main() {
	done := make(chan int)
	go func() {
		fmt.Println("你好, 世界")
		<-done//这个是接收
	}()
	done <- 1//这个是发送
}

对于从无缓冲Channel进行的接收,发生在对该Channel进行的发送完成之前。因此,后台线程<-done接收操作完成之后,main线程的done <- 1发送操作才可能完成(从而退出main、退出程序),而此时打印工作已经完成了。

打印->接收->阻塞->发送->退出

接收和发送反一下也可以

package main
import "fmt"
func main() {
	done := make(chan int)
	go func() {
		fmt.Println("你好, 世界")
		done <- 1//这个是发送
	}()
	<-done//这个是接收
}

接收->阻塞->打印->发送->退出

下面是有缓冲

package main
import "fmt"
func main() {
	done := make(chan int, 1)
	go func() {
		fmt.Println("你好, 世界")
		<-done//这个是接收
	}()
	done <- 1//这个是发送
}

如果还这么写就不一定会打印,因为有缓冲,直接就发送了1个,然后main就退出了,反一下

package main
import "fmt"
func main() {
	done := make(chan int, 1)
	go func() {
		fmt.Println("你好, 世界")
		done <- 1//这个是发送
	}()
	<-done//这个是接收
}

在main里因为channel为空,他会等待发送,所以就能打印了

接收->阻塞->打印->发送->退出

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:家里蹲的狐狸 » go语言channel简单例子理解

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活