我是 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/