bandian
V2EX  ›  问与答

请问如何正确理解 go 的 goroutine 和 channel

  •  
  •   bandian · Mar 5, 2020 · 892 views
    This topic created in 2282 days ago, the information mentioned may be changed or developed.

    比如下面的程序

    package main
    
    import "fmt"
    
    func main() {
    	ch := make(chan int)
    	go hello(ch)
    	go world(ch)
    	fmt.Println(<-ch, <-ch)
    }
    
    func hello(ch chan int) {
    	ch<-5
    }
    
    func world(ch chan int){
    	ch<-10
    }
    

    有时候输出是 5 10 有时候是 10 5

    我是否可以这样理解,hello()跟 world()两个函数是同时执行的,有时候是 hello 先执行完,然后 ch 阻塞,ch 的值就被读取然后放在 Println 的第一个 ch 位置上,然后阻塞解除,之后 world 也向 channel 写入了数据阻塞,然后 ch 又把值读取到了 Println 的第二个 ch 的位置上。

    输出结果不同就是因为两个程序执行的速度不同导致的。

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5732 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 01:56 · PVG 09:56 · LAX 18:56 · JFK 21:56
    ♥ Do have faith in what you're doing.