亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用CGo調用帶有雙指針輸出參數的C函數

使用CGo調用帶有雙指針輸出參數的C函數

Go
當年話下 2023-03-21 16:46:29
我試圖找出調用此函數的正確方法:有兩件事你可以做,要么使用緩沖通道不阻塞,即使另一端沒有人接收。這樣您就可以立即刷新通道內的值。一種更有效的方法是檢查通道中是否有任何可用值,或者通道是否關閉,這應該由發送方在發送所有值時關閉。接收者可以通過為接收表達式分配第二個參數來測試通道是否已關閉。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.ucharwill 被初始化為 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 頻道上的人們幫助我理解了這一點!


查看完整回答
反對 回復 2023-03-21
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號