如题,记录一些自认为有趣的特性
定时器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package mainimport ( "fmt" "time" ) func main () { timer1 := time.NewTimer(2 * time.Second) <-timer1.C fmt.Println("timer1 is done" ) timer2 := time.NewTimer(2 * time.Second) go func () { <-timer2.C fmt.Println("timer2 is done" ) }() stop := timer2.Stop() if stop { fmt.Println("timer2 is stop" ) } }
打点器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package mainimport ( "fmt" "time" ) func main () { ticker := time.NewTicker(700 * time.Millisecond) ch := make (chan bool ) go func () { for { select { case t := <-ticker.C: fmt.Println("Tick at" , t) case <-ch: return } } }() time.Sleep(3 * time.Second) ticker.Stop() ch <- true fmt.Println("ticker stopped" ) }
结果:
时间限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 package mainimport ( "fmt" "time" ) func main () { conti := make (chan time.Time, 4 ) for i := 0 ; i <= 3 ; i++ { conti <- time.Now() } go func () { for t := range time.Tick(300 * time.Millisecond) { conti <- t } }() requt := make (chan int , 7 ) for i := 0 ; i < 7 ; i++ { requt <- i } close (requt) for r := range requt { <-conti fmt.Println(r, " is done" , time.Now()) } }
原子计数器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package mainimport ( "fmt" "sync" "sync/atomic" ) func main () { var ops uint64 var wg sync.WaitGroup for i := 1 ; i <= 20 ; i++ { wg.Add(1 ) go func () { for j := 0 ; j < 50 ; j++ { atomic.AddUint64(&ops, 1 ) } wg.Done() }() } wg.Wait() fmt.Println(ops) }
互斥锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 package mainimport ( "fmt" "sync" ) type Counti struct { mu sync.Mutex contner map [string ]int } func (c *Counti) inc(name string ) { c.mu.Lock() defer c.mu.Unlock() c.contner[name] += 1 } func main () { c := Counti{ contner: map [string ]int {"aa" : 0 , "bb" : 0 }, } var wg sync.WaitGroup prog := func (name string , n int ) { for i := 0 ; i < n; i++ { c.inc(name) } wg.Done() } wg.Add(3 ) go prog("aa" , 500 ) go prog("aa" , 500 ) go prog("bb" , 400 ) wg.Wait() fmt.Println(c.contner) }
panic&revocer&defer
程序执行过程中遇到显式的panic会立即开始回溯调用栈,只有 defer 语句能在这个回溯过程中被执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package mainimport "fmt" func performTask () { defer func () { if r := recover (); r != nil { fmt.Println("捕获到 panic:" , r) } }() fmt.Println("任务开始执行" ) panic ("执行任务时出现严重错误" ) fmt.Println("这行代码不会被执行" ) } func main () { fmt.Println("程序开始" ) performTask() fmt.Println("程序继续执行,未崩溃" ) }
时间戳
时间戳是一个表示特定时间点的单一数值,通常是从某个固定的起始时间(纪元)开始计算,到指定时间点所经过的时间量。在 Unix 系统中,纪元是 1970 年 1 月 1 日 00:00:00 UTC,常见的时间戳单位有秒、毫秒、微秒、纳秒等。例如,1672531200 这个秒级时间戳代表的是从 1970 年 1 月 1 日 00:00:00 UTC 到 2023 年 1 月 1 日 00:00:00 UTC 所经过的秒数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package mainimport ( "fmt" "time" ) func main () { now := time.Now() secs := now.Unix() nanos := now.UnixNano() fmt.Println(now) millis := nanos / 1000000 fmt.Println(secs) fmt.Println(millis) fmt.Println(nanos) fmt.Println(time.Unix(secs, 0 )) fmt.Println(time.Unix(0 , nanos)) specifiedTime, err := time.Parse("2006-01-02 15:04:05" , "2024-10-01 12:00:00" ) if err != nil { fmt.Println("时间解析错误:" , err) return } timestamp := specifiedTime.Unix() fmt.Println("指定时间的秒级时间戳:" , timestamp) }