You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用Go库传递字符串与整数参数的问题排查

问题解决:Go库与Python ctypes交互的参数问题

初始类型错误原因

初始代码中,Go函数第三个参数是string类型,但Python的argtypes将其声明为ctypes.c_int,同时传参时直接传入字符串"JAN",类型不匹配导致ctypes.ArgumentError。

更新后仅获取首字符的问题解决

问题根源

  1. Python未指定argtypes时,默认将字符串转为宽字符指针(c_wchar_p),而Go函数接收的是C风格字节串指针(*C.char)。宽字符每个字符占2字节,第二个字节为0,C.GoString遇到第一个0就会截断,因此只能拿到首字符。
  2. Python传参时直接传入字符串而非字节串,与Go的*C.char类型不匹配。

修复方案

1. 修正Python代码

  • 明确指定argtypes为[ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p],确保参数类型匹配。
  • 所有字符串参数转为字节串(用b"xxx"或.encode('utf-8'))。
  • 将restype设为ctypes.c_char_p,对应Go返回的*C.char。

修正后的Python代码:

import ctypes
library = ctypes.cdll.LoadLibrary('./lib.so')
get_data = library.getData

# 明确指定参数和返回值类型
get_data.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
get_data.restype = ctypes.c_char_p

# 所有字符串参数转为字节串
j = get_data(b"BTC", b"3", b"JAN", b"23")
print(j.decode('utf-8'))

2. Go代码确认(无需修改,确保导出正确)

确保Go代码正确导出,且使用C.GoString正确转换:

//export getData
func getData(symbol, day, month, year *C.char) *C.char {
    x := C.GoString(symbol) + "-" + C.GoString(day) + "-" + C.GoString(month) + "-" + C.GoString(year)
    log.Println(x)
    // 处理后返回C风格字符串,注意使用C.CString并在合适时机释放内存(长期运行需避免内存泄漏)
    return C.CString(x)
}

额外注意事项

Go中使用C.CString创建的C风格字符串,需要手动调用C.free释放内存,避免内存泄漏。短生命周期调用可忽略,长期运行场景建议添加释放逻辑。

内容的提问来源于stack exchange,提问作者Volatil3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:20:47