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

dan*_*obo 7 go

我是Go的新手,并试图学习如何从Go调用C语言.我写了这个程序来打开一个命名的信号量,获取值并将其打印到屏幕上.当我运行它时,go build semvalue.go我收到错误: ./semvalue.go:16:14: unexpected type: ...

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

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)
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jim*_*imB 11

该消息令人困惑,直到您意识到它...是C函数的可变部分.你不能直接在Go中使用C variadic函数,所以你必须在C中编写一个小包装来调用sem_open.

还有几点说明:

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