Почему gickang ticker.Stop () не работает в tickerTest1? - PullRequest
0 голосов
/ 25 мая 2018

result of two testTicker

Я знаю, что функция Stop не может закрыть канал.Я просто запутался с двумя разными результатами tickerTest1 и tickerTest2.

package main

import (
    "time"
    "log"
)

func tickerTest1() {
    ticker := *time.NewTicker(time.Second)
    count := 0
    go func() {
        time.Sleep(3*time.Second)
        ticker.Stop()
    }()
    for range ticker.C {
        count ++
        log.Println("tickerTest1:", count)
    }
}

func tickerTest2() {
    ticker := time.NewTicker(time.Second)
    count := 0
    go func() {
        time.Sleep(3*time.Second)
        ticker.Stop()
    }()
    for range ticker.C {
        count ++
        log.Println("tickerTest2:", count)
    }
}

func main() {
    go tickerTest1()
    tickerTest2()
}

1 Ответ

0 голосов
/ 25 мая 2018

tickerTest2() работает как положено, поэтому давайте рассмотрим tickerTest1().

time.NewTicker() возвращает значение указателя, значение типа *time.Ticker,Это уже намекает на то, что вы должны использовать его так: как указатель (и не следует разыменовывать его).

Тем не менее, вы разыменовываете его, используя оператор косвенного обращения:

ticker := *time.NewTicker(time.Second)

Разыменовываете его, ticker будет иметь тип time.Ticker, не указатель типа.И его значением будет копия значения, указанного указателем, который возвращает NewTicker().

Это само по себе не будет проблемой, поскольку Go автоматически принимает адрес ticker всякий раз, когда вы вызываете метод с указателем на него (например, Ticker.Stop()).Но адрес, который передается как получатель, будет адресом этой переменной ticker, и любой метод, который изменяет структуру time.Ticker, будет изменять только эту отдельную копию, а не значение time.Ticker, указанное в возвращаемом значении.значение функции NewTicker().

По сути, вы останавливаете только копию Ticker, хранящуюся в переменной ticker, а не оригинал Ticker, который был возвращен NewTicker() и которыйна самом деле отправляет значения на канале.Это остается не остановленным.

...