MST

星途 面试题库

面试题:Go中cgo如何处理基本数据类型转换

在Go的cgo编程中,举例说明Go的基本数据类型(如int、string等)如何与C语言的基本数据类型进行相互转换,需要给出具体代码示例。
19.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go的cgo编程中,以下是Go的基本数据类型与C语言基本数据类型相互转换的示例:

  1. 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并打印。
  1. 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返回的字符串指针在使用完后也需要释放内存。