pointers - Golang time.Tick 当其他 goroutine 新建一个结构并且该结构具有 []byte 切片时阻塞
问题描述
我是golang新人,今天遇到一个time.tick问题,让我很困惑,请看下面代码
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 slice 时,tick 会阻塞,代码不会打印“Calculated...”内容,并且
<-tick
代码将在那里阻塞。像上面的代码
如果 struct Encoder 不是切片,但 NewEncoder 函数返回一个指针,则刻度也不起作用,如以下代码
func NewEncoder() *Encoder {
return &Encoder{4)}
}
只有 struct Encoder 没有 []byte 切片,并且 NewEncoder 函数返回非指针编码器,tick 才能正常工作。
我尝试替换代码:
<-tick
经过
time.Sleep(1 * time.Second)
效果是一样的
不知道为什么要打码?
解决方案
推荐阅读
- npm - Webpack 可以用 coffee-loader 构建 Vue 模板吗?
- haskell - 如何转置二维向量
- pandas - 删除行:与其他列不匹配
- jquery - Html 5 Audio 在 iphone safari 浏览器中不起作用
- python - 如何从 pandas 数据框中取出值并将它们放入一个 numpy 数组中?
- linux - 如何用Linux中所有目录的所有文件中的匹配字符串替换空字符串
- autodesk-viewer - 如何隐藏物品?
- javascript - 增加一个变量的值直到它与Javascript中另一个变量的值匹配的最快方法是什么?
- octopus-deploy - 使用不同的部署目标在项目中执行多个“部署发布”步骤
- gcc - 重命名 libcrypto 和 libssl