我是新来的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具有[] byte切片时,滴答声将被阻止,代码将不会打印“ Calculated ...”内容,并且
<-tick
代码将在此处阻止。就像上面的代码
如果struct Encoder不是切片,但是NewEncoder函数返回了一个指针,则刻度也将不起作用,如下面的代码
func NewEncoder() *Encoder {
return &Encoder{4)}
}
仅struct Encoder没有[] byte slice,NewEncoder函数返回非指针Encoder,该勾号可以正常工作。
我尝试替换代码:
<-tick
通过
time.Sleep(1 * time.Second)
效果是一样的
我不知道为什么要输入代码?