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()
и которыйна самом деле отправляет значения на канале.Это остается не остановленным.