面试题答案
一键面试在Go的cgo编程中,以下是Go的基本数据类型与C语言基本数据类型相互转换的示例:
- int类型转换:
package main
/*
#include <stdio.h>
void printInt(int num) {
printf("C received int: %d\n", num);
}
*/
import "C"
import "fmt"
func main() {
goNum := 42
cNum := C.int(goNum)
C.printInt(cNum)
newGoNum := int(cNum)
fmt.Printf("Go received int: %d\n", newGoNum)
}
在上述代码中:
- 首先在Go中将一个Go的
int
类型变量goNum
赋值为42 ,然后通过C.int
将其转换为C语言的int
类型cNum
,并调用C语言函数printInt
打印出来。 - 接着又通过
int
将C语言的int
类型cNum
转换回Go的int
类型newGoNum
并打印。
- string类型转换:
package main
/*
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void printString(const char* str) {
printf("C received string: %s\n", str);
}
char* returnString() {
char* str = "Hello from C";
char* newStr = (char*)malloc(strlen(str) + 1);
strcpy(newStr, str);
return newStr;
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
goStr := "Hello from Go"
cStr := C.CString(goStr)
defer C.free(unsafe.Pointer(cStr))
C.printString(cStr)
newCStr := C.returnString()
defer C.free(unsafe.Pointer(newCStr))
newGoStr := C.GoString(newCStr)
fmt.Printf("Go received string: %s\n", newGoStr)
}
在这个示例中:
- 对于从Go的
string
到C的const char*
转换,使用C.CString
将Go的string
转换为C语言可识别的以null结尾的字符串,使用完后需要通过C.free
释放内存。 - 从C的
char*
到Go的string
转换,使用C.GoString
将C语言的以null结尾的字符串转换为Go的string
。同样,从C返回的字符串指针在使用完后也需要释放内存。