select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支。当多个都准备好的时候,会随机选择一个。
复制代码代码如下:
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c <- x:
x, y = y, x + y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0i <10i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}
默认选择
当 select 中的其他条件分支都没有准备好的时候,default 分支会被执行。
为了非阻塞的发送或者接收,可使用 default 分支:
select {
case i := <-c:
// use i
default:
// receiving from c would block
}
复制代码代码如下:
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(1e8)
boom := time.After(5e8)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(".")
time.Sleep(5e7)
}
}
}
全球以英国伦敦格林威治作为零度经线的起点,每隔15经度为一个时区,15度经线为该时区的中央经线,共分为24个时区。由西向东每隔15经度增加一个时区,相反的,每向西15经度减少一个时区。中国所在时区为东8区。
当前时间 time.Now() 返回的是当地时区的时间:
CST可以代表如下四个不同的时区:
time.Now() 返回的 +0800 CST 表示的就是中国标准时间,与UTC时间有如下的转化:
Wall Clocks表示挂钟时间,存储的是自1970 年 1 月 1 日 0 时 0 分 0 秒以来的时间戳,当系统和授时服务器进行校准时间时间操作时,有可能造成这一秒是2018-1-1 00:00:00,而下一秒变成了2017-12-31 23:59:59的情况。
Monotonic Clocks,意思是单调时间的,所谓单调,就是只会不停的往前增长,不受校时操作的影响,这个时间是自进程启动以来的秒数。
time.Now() 返回的 m=+0.004002201 就是表示Monotonic Clocks
go语言中如果不设置指定的时区,通过 time.Now() 获取到的就是本地时区
设置时区有两种方式:
固定时区到东八区。但这种不是对程序的全局设置,每次获取时都需要固定时区
加载指定时区。但如果没有go环境使用这种方式就会加载失败,因为时区信息是放在go的安装包中的。
如果你用第二种方式加载时区,在打docker镜像时就需要进行时区相关的配置,配置文件如下:
参考文章:
https://zhuanlan.zhihu.com/p/47754783
https://blog.mimvp.com/article/11887.html