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

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

使用CGo調(diào)用帶有雙指針輸出參數(shù)的C函數(shù)

使用CGo調(diào)用帶有雙指針輸出參數(shù)的C函數(shù)

Go
當(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.ucharwill 被初始化為 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)!


查看完整回答
反對 回復(fù) 2023-03-21
  • 1 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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