使用CGo调用带有双指针输出参数的C函数

我试图找出调用此函数的正确方法:

有两件事你可以做,要么使用缓冲通道不阻塞,即使另一端没有人接收。这样您就可以立即刷新通道内的值。


一种更有效的方法是检查通道中是否有任何可用值,或者通道是否关闭,这应该由发送方在发送所有值时关闭。


接收者可以通过为接收表达式分配第二个参数来测试通道是否已关闭。


v, ok := <-ch 

ok如果false没有更多的值可以接收并且通道关闭。使用 select as 检查通道内的值


package main


import (

    "fmt"

    "sync"

)


var queue = make(chan int)

var wg sync.WaitGroup


func 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)

}


当年话下
浏览 102回答 1
1回答

尚方宝剑之说

显然,第一个版本很好。引用文档:Go 代码可以将 Go 指针传递给 C,前提是它指向的 Go 内存不包含任何 Go 指针。据我了解,由于var bufferContents *C.ucharwill 被初始化为 nil,因此它不算作上述规则的“Go 指针”。以下简化的代码示例证实了这一点:package main// void F(char **p) {}import "C"func main() {&nbsp; &nbsp; var p *C.char = new(C.char)&nbsp; &nbsp; C.F(&p)}将触发“恐慌:运行时错误:cgo 参数具有指向 Go 指针的 Go 指针”package main// void F(char **p) {}import "C"func main() {&nbsp; &nbsp; var p *C.char&nbsp; &nbsp; C.F(&p)}工作得很好,即使在设置GODEBUG=cgocheck=2.感谢 Gophers Slack 社区的#cgo 频道上的人们帮助我理解了这一点!
打开App,查看更多内容
随时随地看视频慕课网APP