go - 意外类型 : . .. 在 Go 中使用 cgo

标签 go

我是 Go 的新手,正在尝试学习如何从 Go 调用 C。我编写这个程序来打开一个命名的信号量,获取值并将其打印到屏幕上。 当我运行它时 go build semvalue.go 我得到了错误: ./semvalue.go:16:14: 意外类型:...

这是什么意思?我做错了什么?

package main

import "fmt"

// #cgo LDFLAGS: -pthread
// #include <stdlib.h>
// #include <fcntl.h>
// #include <sys/stat.h>
// #include <semaphore.h>
import "C"

func main() {
    name := C.CString("/fram")
    defer C.free(name)

    fram_sem := C.sem_open(name, C.O_CREAT, C.mode_t(0644), C.uint(1))
    var val int
    ret := C.sem_getvalue(fram_sem, val)
    fmt.Println(val)
    C.sem_close(fram_sem)
}

谢谢。

最佳答案

消息令人困惑,直到您意识到 ... 是 C 函数的可变参数部分。您不能直接在 Go 中使用 C 可变参数函数,因此您必须在 C 中编写一个小的包装器来调用 sem_open

一些注意事项:

  • C.free 应该用 C.free(unsafe.Pointer(name))
  • 调用
  • val 需要是一个 *C.int
  • sem_getvalue 使用 errno,所以你应该用 ret, err := C.sem_getvalue...
  • 来调用它

关于go - 意外类型 : . .. 在 Go 中使用 cgo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852407/

相关文章:

types - 在 go 中检查自定义类型的 "go"方法是什么?

mysql - 如何从 GO 在 mysql 中创建触发器。似乎不支持使用 DELIMITER

sockets - 如果没有 EOF,从 Golang 中的服务器读取 Unix Socket 响应的最佳方法是什么

go - 我如何比较golang中的两个文件?

go - 如何获得分配给机器的所有 IP 地址?

go - 不能使用 nil 作为类型模型。返回参数中的文章

go - 将oracle时间字符串转换为time.Time golang

go - 有没有办法广播到redis中的每个 channel ?

regex - 我的(有效?)正则表达式在 gorilla/mux 中不起作用

c - Golang 使用 cgo 从共享 c 库调用函数