首页 > 解决方案 > 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) 

效果是一样的

不知道为什么要打码?

标签: pointersgoslicegoroutineticker

解决方案


推荐阅读