Golang时间。当其他goroutine新建一个结构并且该结构具有[] byte slice

时间:2018-12-01 07:09:42

标签: pointers go slice goroutine ticker

我是新来的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) 

效果是一样的

我不知道为什么要输入代码?

0 个答案:

没有答案