关于Golang的chan与go的位置的一点思考

上一段代码:

package main
import (
    "fmt"
)
func f1(in chan int) {
    fmt.Println(<-in)
}
func main() {
    out := make(chan int)
    out <- 2
    go f1(out)
}

这是不能编译的,提示说:
fatal error: all goroutines are asleep - deadlock!
有死锁,但是讲道理的话,是没有的。
如果我硬要让这段代码能编译通过呢?
改成如下代码;

func main() {
    out := make(chan int)
    go f1(out)
    out <- 2
}

讲道理,这和上一段没有什么实质的变化。那么问题来了,我再来一个go func,会产生死锁的那种,看看行还是不行。
代码如下:

func main() {
    out := make(chan int)
    go f1(out)
    out <- 2
    go f2(out)
    time.Sleep(1e9)
}

好吧,只要对chan后再进行go,就不会有什么问题了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,137评论 0 3
  • 原创文章转载请注明出处 Go 运行时(runtime)管理了一种轻量级线程goroutine,被叫做协程。协程可以...
    咕咕鷄阅读 14,734评论 0 8
  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,528评论 1 46
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  • 一别,便是一生 有些人一直没机会见 等有机会见了 却又犹豫了 相见不如不见 有些事一别竟是一辈子 一直没机会做 等...
    魂梦与同阅读 185评论 0 0