第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

迭代golang無(wú)緩沖通道時(shí)輸出混亂

迭代golang無(wú)緩沖通道時(shí)輸出混亂

Go
茅侃侃 2022-06-01 12:21:49
迭代 golang 無(wú)緩沖通道時(shí),我遇到了一個(gè)令人困惑的輸出。通道定義為chan []int。然后我將兩個(gè)切片推送到通道,[0 1] 和 [2 3]。但是當(dāng)我從頻道中獲取元素時(shí),我得到了 [2 3] 和 [2 3]。為什么會(huì)這樣?package mainimport "fmt"import "sync"func producer(jobs chan []int, wg *sync.WaitGroup) {    defer wg.Done()    a := make([]int, 2)    index := 0    for i := 0; i < 4; i++ {        a[index] = i        index++        if index == 2 {            index = 0            fmt.Printf("a: %+v\n", a)            jobs <- a        }        }    close(jobs)}func main() {    var wg sync.WaitGroup    wg.Add(1)    jobs := make(chan []int, 2)    go producer(jobs, &wg)    for job := range jobs {        fmt.Printf("job: %+v\n", job)    }    wg.Wait()}預(yù)期輸出:a: [0 1]a: [2 3]job: [0 1]job: [2 3]實(shí)際輸出:a: [0 1]a: [2 3]job: [2 3]job: [2 3]
查看完整描述

2 回答

?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

切片包含指向支持?jǐn)?shù)組的指針。當(dāng)您通過(guò)通道發(fā)送切片時(shí),您發(fā)送的是對(duì)該支持?jǐn)?shù)組的引用,因此在接收端,即使您多次讀取切片,您實(shí)際上也引用了同一個(gè)共享支持?jǐn)?shù)組。

您可以為每次迭代創(chuàng)建一個(gè)新切片并將其發(fā)送。每個(gè)切片都有一個(gè)單獨(dú)的后備數(shù)組,并且將按您的預(yù)期工作。


查看完整回答
反對(duì) 回復(fù) 2022-06-01
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

稍微修改您的程序以便更好地閱讀。


package main


import "fmt"

import "sync"


func producer(jobs chan []int, wg *sync.WaitGroup) {

    defer wg.Done()


    a := make([]int, 2)

    a[0] = 1

    a[1] = 2

            jobs <- a   //We are passing memory location of slice ( is nature of slice ), so the values changing next line will affect here too

    a[0] = 2

    a[1] = 3

           jobs <- a  

    


    close(jobs)

}


func main() {

    var wg sync.WaitGroup

    wg.Add(1)

    jobs := make(chan []int, 2)

    go producer(jobs, &wg)

    for job := range jobs {

        fmt.Printf("job: %+v\n", job)

    }


    wg.Wait()

}

我用 Array 嘗試過(guò)的相同程序,然后我們將得到您期望的結(jié)果,請(qǐng)參見(jiàn)下面的代碼


package main


import "fmt"

import "sync"


func producer(jobs chan [2]int, wg *sync.WaitGroup) {

    defer wg.Done()


   var a[2]int

    a[0] = 1

    a[1] = 2

            jobs <- a   

    a[0] = 2

    a[1] = 3

           jobs <- a  

    


    close(jobs)

}


func main() {

    var wg sync.WaitGroup

    wg.Add(1)

    jobs := make(chan [2]int)

    go producer(jobs, &wg)

    for job := range jobs {

        fmt.Printf("job: %+v\n", job)

    }


    wg.Wait()

}


查看完整回答
反對(duì) 回復(fù) 2022-06-01
  • 2 回答
  • 0 關(guān)注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)