Golang中使用CString与cgo及不同C类型交互实践
Golang中使用CString与cgo及不同C类型交互实践 假设我有两个不同的C方法
// My C methods:
MyFirstMethod(const char *str)
MySecondMethod(const char * const str)
我知道可以使用以下代码将变量传递给第一个方法
var strPtr *C.char
strPtr = C.CString("My String Here")
defer C.free(unsafe.Pointer(strPtr))
res := C.MyFirstMethod(strPtr)
但是,对于第二个方法我不太确定,是否有任何区别?我应该使用相同的代码吗?我知道它们不是相同的类型,我不确定是否应该使用其他方式来向第二个方法传递参数。
更多关于Golang中使用CString与cgo及不同C类型交互实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html
这里没有区别。const char * 是一个可更改的指针,指向零个或多个不可更改的 char。const char * const 是一个不可更改的指针,指向零个或多个不可更改的字符。由 C.CString 分配的底层缓冲区的可变性对你的 C 代码来说并不重要。你甚至可以将数据作为 char * 或 char * const 传递。
更多关于Golang中使用CString与cgo及不同C类型交互实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,使用cgo与C的const char*和const char* const类型交互时,传递参数的方式是相同的。这两种类型在C端都表示指向常量字符的指针,区别仅在于C语言层面的指针本身是否可修改(const char* const的指针不可重新赋值),但这不影响Go调用时的参数传递。
对于你的两个C方法,可以使用相同的Go代码:
package main
/*
#include <stdlib.h>
// 示例C函数声明
void MyFirstMethod(const char *str);
void MySecondMethod(const char * const str);
*/
import "C"
import (
"unsafe"
)
func main() {
str := C.CString("My String Here")
defer C.free(unsafe.Pointer(str))
// 调用第一个方法
C.MyFirstMethod(str)
// 调用第二个方法 - 使用相同的参数
C.MySecondMethod(str)
}
关键点:
C.CString返回的是*C.char类型,它可以直接传递给接受const char*或const char* const的C函数- Go的
*C.char类型在传递给C函数时,会自动处理const限定符的兼容性 - 两种情况下都需要使用
defer C.free(unsafe.Pointer(str))来释放内存
即使C函数参数声明为const char* const,Go端的调用代码也无需特殊处理。cgo的类型转换系统会处理这些const限定符的差异。

