为了账号安全,请及时绑定邮箱和手机立即绑定

使用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 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信