zoukankan      html  css  js  c++  java
  • go channel

    创建channel

    可以通过make函数来创建channel,channel是引用类型,空值为nil

    ch := make(chan int)
    

    close channel

    使用close函数关闭channel之后,后续的发送调用都会panic,后续的接收调用都会收到空值,可以用下面的语法判断channel是否被关闭:

    value, ok := <- ch
    

    使用for range语法可以自动判断channel是否已经关闭

    func main() {
    	naturals := make(chan int)
    	squares := make(chan int)
    	// Counter
    	go func() {
    		for x := 0; x < 100; x++ {
    			naturals <- x
    		}
    		close(naturals)
    	}()
    	// Squarer
    	go func() {
    		for x := range naturals {
    			squares <- x * x
    		}
    		close(squares)
    	}()
    	// Printer (in main goroutine)
    	for x := range squares {
    		fmt.Println(x)
    	}
    }
    

    close一个已经close的channel,或者nilchannel时,都会引起panic

    channel复用

    go中提供select语法,可以对channel进行复用,效果就跟C++中对IO操作复用一样:

    func main() {
    	ch := make(chan int, 1)
    	for {
    		select {
    		case ch <- 0:
    		case ch <- 1:
    		}
    		i := <-ch
    		fmt.Println(i)
    	}
    }
    

    select随机选择一个就绪的可读或者可写的channel执行,如果都没有就绪就会陷入等待,上面的代码会随机输出0和1的序列。

  • 相关阅读:
    185. [USACO Oct08] 挖水井
    JavaEE Tutorials (9)
    vjudge A
    HDU 2089 不要62
    国庆 day 2 下午
    国庆 day 2 上午
    国庆 day 1 下午
    P2899 [USACO08JAN]手机网络Cell Phone Network
    洛谷 P1690 贪婪的Copy
    洛谷 P2209 [USACO13OPEN]燃油经济性Fuel Economy
  • 原文地址:https://www.cnblogs.com/HachikoT/p/14117521.html
Copyright © 2011-2022 走看看