當(dāng)年話下
2023-03-21 16:46:29
我試圖找出調(diào)用此函數(shù)的正確方法:有兩件事你可以做,要么使用緩沖通道不阻塞,即使另一端沒有人接收。這樣您就可以立即刷新通道內(nèi)的值。一種更有效的方法是檢查通道中是否有任何可用值,或者通道是否關(guān)閉,這應(yīng)該由發(fā)送方在發(fā)送所有值時(shí)關(guān)閉。接收者可以通過為接收表達(dá)式分配第二個(gè)參數(shù)來測試通道是否已關(guān)閉。v, ok := <-ch ok如果false沒有更多的值可以接收并且通道關(guān)閉。使用 select as 檢查通道內(nèi)的值package mainimport ( "fmt" "sync")var queue = make(chan int)var wg sync.WaitGroupfunc process(){ values := []int{1,2,5,3,9,7} for _, value := range values { queue <- value }}func main () { for i :=0; i < 10; i++ { go process() } wg.Add(1) go func(){ defer wg.Done() for j:=0;j<30;j++ { select { case <-queue: fmt.Println(<-queue) } } }() wg.Wait() close(queue)}
1 回答

尚方寶劍之說
TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
顯然,第一個(gè)版本很好。引用文檔:
Go 代碼可以將 Go 指針傳遞給 C,前提是它指向的 Go 內(nèi)存不包含任何 Go 指針。
據(jù)我了解,由于var bufferContents *C.uchar
will 被初始化為 nil,因此它不算作上述規(guī)則的“Go 指針”。以下簡化的代碼示例證實(shí)了這一點(diǎn):
package main
// void F(char **p) {}
import "C"
func main() {
var p *C.char = new(C.char)
C.F(&p)
}
將觸發(fā)“恐慌:運(yùn)行時(shí)錯(cuò)誤:cgo 參數(shù)具有指向 Go 指針的 Go 指針”
package main
// void F(char **p) {}
import "C"
func main() {
var p *C.char
C.F(&p)
}
工作得很好,即使在設(shè)置GODEBUG=cgocheck=2.
感謝 Gophers Slack 社區(qū)的#cgo 頻道上的人們幫助我理解了這一點(diǎn)!
- 1 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報(bào)
0/150
提交
取消