Ich verwende einen Ticker, um Aufgaben in regelmäßigen Abständen auszuführen, aber ich habe einige Probleme, wenn Sie es ändern. Ich werde den Ticker beim Empfang einiger Nachrichten in einen neuen ändern und das Intervall ändern. Hier ist der Beispielcode, der das Problem reproduzieren wird:Ändern Sie einen Kanal in wählen Sie {Fall: Kanal}
package main
import (
"fmt"
"time"
)
type A struct {
ticker *time.Ticker
}
func (a *A) modify() {
a.ticker.Stop()
a.ticker = time.NewTicker(time.Second)
}
func main() {
a := new(A)
a.ticker = time.NewTicker(time.Second)
go func() {
for {
select {
case <-a.ticker.C:
fmt.Println("now")
go a.modify()
/*
default:
//fmt.Println("default")
time.Sleep(time.Millisecond * 100)
*/
}
}
}()
time.Sleep(time.Second * 60)
}
"jetzt" wird nur einmal gedruckt. Aber es wird kontinuierlich gedruckt werden, wenn ich die „go“, wie diese zu entfernen:
package main
import (
"fmt"
"time"
)
type A struct {
ticker *time.Ticker
}
func (a *A) modify() {
a.ticker.Stop()
a.ticker = time.NewTicker(time.Second)
}
func main() {
a := new(A)
a.ticker = time.NewTicker(time.Second)
go func() {
for {
select {
case <-a.ticker.C:
fmt.Println("now")
a.modify()
/*
default:
//fmt.Println("default")
time.Sleep(time.Millisecond * 100)
*/
}
}
}()
time.Sleep(time.Second * 60)
}
Auch wenn ich die Standard-Klausel unkommentiert lassen, „jetzt“ kann kontinuierlich gedruckt werden. Kann mir jemand erklären, wie das passieren würde?
Verstanden! Warum also der Fall mit dem Default erklärt werden kann –