亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang 代碼是如何工作的?

golang 代碼是如何工作的?

Go
慕的地8271018 2022-01-17 20:06:15
func Tick() {                                                                                                                                             fmt.Println("startTime", time.Now().Format("2006-01-02 15:04:05"))                                                                                    t := time.NewTicker(time.Second * 3)                                                                                                                  time.Sleep(time.Second * 12)                                                                                                                          for {                                                                                                                                                     stamp := <-t.C                                                                                                                                        fmt.Println("tickTime", stamp.Format("2006-01-02 15:04:05"))                                                                                      }                                                                                                                                                 }          上面代碼段的輸出是:開始時間 2016-06-22 16:22:20滴答時間 2016-06-22 16:22:23滴答時間 2016-06-22 16:22:35滴答時間 2016-06-22 16:22:38滴答時間 2016-06-22 16:22:41滴答時間 2016-06-22 16:22:44當我延遲代碼時,為什么會在沒有時間戳 16:22:26、16:22:29 的情況下發生這種情況?
查看完整描述

1 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

這是 Ticker 源(請原諒行號,我從文檔源頁面復制了這個):


    func NewTicker(d Duration) *Ticker {

            if d <= 0 {

                panic(errors.New("non-positive interval for NewTicker"))

            }

            // Give the channel a 1-element time buffer.

            // If the client falls behind while reading, we drop ticks

            // on the floor until the client catches up.

            c := make(chan Time, 1)

            t := &Ticker{

                C: c,

                r: runtimeTimer{

                    when:   when(d),

                    period: int64(d),

                    f:      sendTime,

                    arg:    c,

                },

            }

            startTimer(&t.r)

            return t

        }

注意評論


// Give the channel a 1-element time buffer.

// If the client falls behind while reading, we drop ticks

// on the floor until the client catches up.

發生了什么:

  1. 您創建計時器

  2. 計時器產生它的第一個滴答聲并緩沖它。

  3. 現在它等待、喚醒和阻塞,等待你消費,以便它可以產生第 2 個滴答。

  4. 最終,你的 goroutine 喚醒并立即消耗它產生的前兩個滴答聲,并再次開始產生滴答聲。

編輯:此外,文檔NewTicker(這Tick是一個方便的功能)說:

NewTicker 返回一個新的 Ticker,其中包含一個通道,該通道將以持續時間參數指定的周期發送時間。它調整間隔或丟棄滴答聲以彌補慢速接收器。持續時間 d 必須大于零;如果沒有,NewTicker 會恐慌。停止代碼以釋放相關資源。

雖然它沒有明確提到它是一個緩沖區為 1 的通道。



查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號