如何从Go语言调用此C函数(使用Cgo工具)

如何从Go语言调用此C函数(使用Cgo工具),go,Go,下面是C函数声明 CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); 如何从Go调用此函数 type Easy struct { curl unsafe.Pointer code C.CURLcode } func (e *Easy)SetOption(option C.CURLoption, ...) { e.code = C.curl_easy_setopt(e.cu

下面是C函数声明

CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
如何从Go调用此函数

type Easy struct {
    curl unsafe.Pointer
    code C.CURLcode
}

func (e *Easy)SetOption(option C.CURLoption, ...) {
    e.code = C.curl_easy_setopt(e.curl, option, ????))
}

你不能直接打电话。CGO在C端不能很好地使用vararg函数。 理想情况下,您可以创建一个C包装器,它接受您想要传递的选项列表。 然后,C函数应将该列表扩展为
curl\u easy\u set\u opt()
所需的变量参数。但我不确定这是否可行,也不知道如何着手去做

Go函数的签名也不正确:

type Option C.CURLoption

func (e *Easy) SetOption(options ...Option) {
    // 'options' is now accessible as a slice: []Option
    // Turn this slice into a list of C.CURLoption pointers and pass it to
    // your C wrapper.

    if len(options) == 0 {
        return // No use continuing.
    }

    // Here is one way to convert the option slice to a list
    // that C can work with.
    size := int(unsafe.Sizeof(options[0]))
    list := C.malloc(C.size_t(size * len(options)))
    defer C.free(unsafe.Pointer(list)) // Free this after use!

    for i := range options {
        ptr := unsafe.Pointer( uintptr(list) + uintptr(size * i) )
        *(*C.CURLoption)(ptr) = C.CURLoption(options[i])
    }

    C.my_setopt_wrapper(e.curl, list, C.int(len(options)))
}
请注意,选项参数的类型已更改为go版本。当有人使用您的包时,他们无法访问C.xxx类型。因此,您不应该在公共api中使用这些。它们仅用于您的软件包中的内部使用