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

达里乌斯·库辛斯卡斯(Darius Kucinskas)

这是此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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用C语言中的函数调用函数

如何使用cgo用argv包装C语言“ hello world”?

从Go语言调用的C#DLL(类库)函数

通过go模块中的内存地址从.so文件中调用C函数。(cgo)

用cgo在C语言中编写go字符串

如何用Go语言在另一个函数中调用一个函数?

如何正确调用此函数?

从C调用Go函数

使用CGo调用带有双指针输出参数的C函数

使用boto调用lambda函数如何异步执行此操作?

如何在调用函数的javascript对象中使用此参数?

如何用Go语言从另一个文件调用函数?

当前有哪些方法可以让您在C语言中调用Go函数?

为什么CGO无法在C中直接调用函数指针?

cgo在C ++中定义的调用函数(在名称空间中)

在Linux中如何使用C语言编写“写”系统调用?

如何使用C语言在MPI中调用相同等级?

如何使用JavaScript或C语言调用键盘键

C语言中的按位运算符:此函数如何工作?

我该如何编写此C函数,以便用户可以在以后不使用“免费”的情况下调用它?

如何使用 Kotlin 编程语言中的函数式方法转换此代码

关于允许直接调用C函数的语言

C语言中受保护的函数调用

在C语言中,如何调用我的函数而不是系统库函数

如何从 Python 调用 Go 函数

JS函数无法从KeyCode中使用/如何使用键盘键调用此JS函数

如何从Go代码中调用Java本机接口C函数?

C语言中使用_Generic混合函数调用并返回常量的重载函数

如何使用Java本机接口从Java调用go函数?