MST

星途 面试题库

面试题:Go语言中使用cgo调用C语言函数,如何处理结构体参数

在Go语言中利用cgo实现与C语言的互操作,若C语言有一个函数接收结构体参数,如`void process_struct(struct MyStruct s);`,请写出对应的Go语言代码实现,包括如何定义结构体以及调用该C函数。
30.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

/*
#include <stdio.h>
#include <stdlib.h>

// 定义C语言中的结构体
typedef struct {
    int id;
    char name[20];
} MyStruct;

// 接收结构体参数的函数
void process_struct(MyStruct s) {
    printf("ID: %d, Name: %s\n", s.id, s.name);
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)

// Go语言中定义对应的结构体
type MyStruct struct {
    id   C.int
    name [20]C.char
}

func main() {
    // 初始化Go语言中的结构体
    var s MyStruct
    s.id = 1
    C.strcpy(&s.name[0], C.CString("John"))

    // 将Go语言结构体转换为C语言结构体指针
    cS := (*C.MyStruct)(unsafe.Pointer(&s))

    // 调用C语言函数
    C.process_struct(*cS)

    // 释放C.CString分配的内存
    C.free(unsafe.Pointer(C.CString("John")))
}

上述代码首先在import "C"之前通过注释的形式定义了C语言中的结构体和函数。然后在Go语言中定义了与之对应的结构体。在main函数中初始化Go语言结构体,转换为C语言结构体指针并调用C语言函数,最后释放通过C.CString分配的内存以避免内存泄漏。