MST

星途 面试题库

面试题:Go语言中Go cgo在跨语言交互调用C函数时如何处理结构体参数

在Go语言中使用cgo进行跨语言交互,当需要调用C函数并传递结构体参数时,应该如何定义Go语言中的结构体以及如何在cgo的代码中正确传递这个结构体?请举例说明。
20.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 定义Go语言中的结构体
    • 在Go语言中定义的结构体需要和C语言中的结构体布局保持一致。如果C语言结构体中有对齐要求,Go语言的结构体标签 cgo 可以用来指定字段的对齐方式。
    • 例如,假设C语言中有如下结构体定义:
    struct Point {
        int x;
        int y;
    };
    
    • 那么在Go语言中可以这样定义:
    package main
    
    /*
    struct Point {
        int x;
        int y;
    };
    */
    import "C"
    import "fmt"
    
    type Point struct {
        x C.int
        y C.int
    }
    
  2. 在cgo代码中正确传递结构体
    • 假设C语言中有一个函数,接收 Point 结构体并返回其坐标之和:
    int sum_of_points(struct Point p) {
        return p.x + p.y;
    }
    
    • 在Go语言中调用这个函数并传递结构体参数:
    //export sum_of_points
    func sum_of_points(p Point) C.int {
        return p.x + p.y
    }
    
    func main() {
        var p Point
        p.x = 3
        p.y = 4
        result := sum_of_points(p)
        fmt.Println(int(result))
    }
    
    • 在上述代码中,首先在Go语言中定义了和C语言对应的 Point 结构体。然后在Go语言中实现了一个名为 sum_of_points 的函数,这个函数接收 Point 结构体并返回坐标之和。在 main 函数中创建了 Point 结构体实例并调用 sum_of_points 函数。

注意:实际使用中,若C语言函数在外部库中,需要通过 #cgo LDFLAGS: -L/path/to/library -lyourlibrary 等方式链接到相应的库。