在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/GO  HTML/ golang中對(duì)time.NewTicker()返回的指針取值后調(diào)用Stop無(wú)法

golang中對(duì)time.NewTicker()返回的指針取值后調(diào)用Stop無(wú)法停止ticker

圖片描述

如圖所示,代碼不長(zhǎng),tickerTest1中對(duì)Ticker指針取值以后Stop沒(méi)有反應(yīng),tickerTest2直接用返回的指針則沒(méi)有任何問(wèn)題。

回答
編輯回答
安若晴

v2 = *p1 將產(chǎn)生新的結(jié)構(gòu)體 v2,它的值由 p1 指針?biāo)傅慕Y(jié)構(gòu)體復(fù)制而來(lái)。

因此,你在 tickerTest2() 中調(diào)用的 ticker.Stop() 并不是 time.NewTicker() 創(chuàng)建的那個(gè),而是復(fù)制品。

舉個(gè)例子參考下

package main

import (
    "testing"
)

func Test_dereference_pointer(t *testing.T) {
    type Foo struct {
        N int
    }

    p1 := &Foo{1}
    f2 := *p1 // 將 p1 克隆成新的結(jié)構(gòu)體 f2,不是引用

    p1.N = 2
    f2.N = 3

    if p1.N != 2 || f2.N != 3 {
        t.Fatal("error")
    }
}
2018年8月19日 10:39
編輯回答
悶騷型

翻了下 runtime 包,發(fā)現(xiàn)在 stop 的時(shí)候有這么一個(gè)判斷 :

if i < 0 || i > last || tb.t[i] != t {
    return false
}

關(guān)鍵在于 tb.t[i] != t。如 @李毅 所說(shuō),如果使用 tick := *time.NewTicker(time.Second) 是復(fù)制了一份,則這個(gè)條件肯定為真,即不釋放該計(jì)時(shí)器資源,相當(dāng)于沒(méi)有 stop。所以計(jì)時(shí)器沒(méi)有停止。


大家都需要注意的是:不要對(duì) Ticker.C 使用 range,因?yàn)樵谡{(diào)用 Ticker.Stop 的時(shí)候并不會(huì) close 該 channel,所以這里相當(dāng)于一個(gè)死循環(huán)。

2017年6月4日 07:17