这是此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_easy_set_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)))
}
请注意,option参数的类型已更改为go版本。当有人使用您的软件包时,他们无权访问C.xxx类型。因此,您不应该在公共api中使用它们。它们仅供包装内部使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句