Go example code中的 urlpoll.go
实现在这里.
Go interfaces
Channel
Example usage here. Channel is a FIFO queue, the send and receive sequence will always be the same.
1 | ch := make(chan int, 100) // constructor of a Channel with capacity of 100 |
如果没有设置容量, 或者容量设置为0, 说明Channel没有缓存, 只有sender和receiver都准备好了后它们的通讯(communication)才会发生(Blocking). 如果设置了缓存, 就有可能不发生阻塞, 只有buffer满了后send才会阻塞,而只有缓存空了后receive才会阻塞。一个nil channel不会通信。
1 | func main() { |
1 | ch <- v // send v into Channel ch |
usage of ‘select’
Golang中的select与C++的switch相似,但select只负责监听 IO操作. select经常用来选择一组可能的sender和receiver操作去处理. select中的case语句可以是send也可以是receive,或者default.
1 | func fibonacci(c, quit chan int){ |
timeout
select很重要的一个应用就是timeout处理.
1 | func main() { |
注意time.After方法,它返回一个类型为<-chan Time
的单向的channel,在指定的时间发送一个当前时间给返回的channel中.
除此之外,还可以用time.Newtimer()
创建一个新的定时器.不过暂时没发现跟time.sleep()的区别 = =
time.NewTicker()
创建一个定时触发的定时器,每隔一定时间就会向指定channel发送当前时间.ticker和timer的构造器都会返回相应的通道.
close
向关闭的channel中发送数据会导致panic: send on closed channel
.但从关闭的channel中取数据会不断的取到0值.可以用ok
确认channel是否已经关闭.
1 | ch1 := make(chan int) |
goroutine(携程)
Golang中go关键字用来创建goroutine, 它在多核cpu环境下是并行的.通常我们使用go关键字和channel实现非阻塞调用. 这里说明了阻塞/非阻塞,同步/异步的区别.
1 | func UnblockedGet(c chan string, url string){ |