Я новичок в golang, сегодня я столкнулся с проблемой времени. Отметьте, это может очень запутать меня, пожалуйста, посмотрите следующий код
var MAX_LEN4 = 5000
func main() {
ch := make(chan struct{}, 100)
var length uint = 0
start := time.Now()
var wg sync.WaitGroup
wg.Add(1)
go func() {
tick := time.Tick(1 * time.Second)
for {
if length > MAX_LEN4+1 {
break
}
<-tick
fmt.Printf("Calculated: %d, time: %f\n", length, time.Since(start).Seconds())
}
wg.Done()
}()
for ; length <= MAX_LEN4+1; length++ {
go test3(length, &ch)
}
wg.Wait()
fmt.Println("Test Finished")
}
func test3(l uint, ch *chan struct{}) {
NewEncoder()
// do something
}
type Encoder struct {
stream []byte
offset uint
//bitLeft uint
}
func NewEncoder() Encoder {
return Encoder{make([]byte, 4)}
}
, когда struct Encoder имеет [] байт, тикбудет заблокирован, код не будет печатать содержимое «Вычислено ...», и код
<-tick
будет блокироваться там.как в приведенном выше коде
, если struct Encoder не имеет фрагмента, но функция NewEncoder возвращает указатель, тик также не работает, как в следующем коде
func NewEncoder() *Encoder {
return &Encoder{4)}
}
только struct Encoderне имеет [] байтового среза и функция NewEncoder не возвращает указатель Encoder, тик будет работать нормально.
Я пытаюсь заменить код:
<-tick
на
time.Sleep(1 * time.Second)
эффект тот же
Не знаю, почему код?