我試圖找出調用此函數的正確方法:有兩件事你可以做,要么使用緩沖通道不阻塞,即使另一端沒有人接收。這樣您就可以立即刷新通道內的值。一種更有效的方法是檢查通道中是否有任何可用值,或者通道是否關閉,這應該由發送方在發送所有值時關閉。接收者可以通過為接收表達式分配第二個參數來測試通道是否已關閉。v, ok := <-ch ok如果false沒有更多的值可以接收并且通道關閉。使用 select as 檢查通道內的值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貢獻1788條經驗 獲得超4個贊
顯然,第一個版本很好。引用文檔:
Go 代碼可以將 Go 指針傳遞給 C,前提是它指向的 Go 內存不包含任何 Go 指針。
據我了解,由于var bufferContents *C.uchar
will 被初始化為 nil,因此它不算作上述規則的“Go 指針”。以下簡化的代碼示例證實了這一點:
package main
// void F(char **p) {}
import "C"
func main() {
var p *C.char = new(C.char)
C.F(&p)
}
將觸發“恐慌:運行時錯誤:cgo 參數具有指向 Go 指針的 Go 指針”
package main
// void F(char **p) {}
import "C"
func main() {
var p *C.char
C.F(&p)
}
工作得很好,即使在設置GODEBUG=cgocheck=2.
感謝 Gophers Slack 社區的#cgo 頻道上的人們幫助我理解了這一點!
- 1 回答
- 0 關注
- 147 瀏覽
添加回答
舉報
0/150
提交
取消