CGO编程

作者: ljh123 | 来源:发表于2018-10-10 23:44 被阅读8次

    1)什么是CGO编程?
    2)CGO语法
    3)相关资料

    一、什么是CGO编程?
    简单说就是GO语言代码中可以编写C代码和调用C代码,在一些偏底层业务中,用C来编写会比较简单,然后GO中来调用

    二、CGO语法
    1)简单案例
    2)GO与C语言类型转换
    3)GO语言传值到C语言

    (1)简单案例

    package main
    /*
    #include <stdio.h>
    int a = 1;
    char s[30] = "12345";
    int fun1() {
        printf("hello cgo!\n");
    }
     */
    import "C"
    import "fmt"
    
    func main() {
        fmt.Println(C.a)
        fmt.Println(C.s)
        C.fun1()
    }
    
    输出结果:
    1
    [49 50 51 52 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    hello cgo!
    

    C代码在GO语言中嵌入在/**/内,然后引入C代码,必须在紧接的下一行,不能有空行或其他代码,否则不能引入

    /*
    C代码
    */
    import "C"
    

    然后GO中调用C代码的话,以C. + 变量名或函数名

    (2)GO与C语言类型转换

    GO调用打印C变量类型:

    package main
    /*
    #include <stdio.h>
    int a = 1;
    float f = 1.2;
    double d = 1.3;
    char c = '1';
    char s[30] = "12345";
     */
    import "C"
    import "fmt"
    
    func main() {
        fmt.Printf("int      %T\n", C.a)
        fmt.Printf("char     %T\n", C.c)
        fmt.Printf("char[30] %T\n", C.s)
        fmt.Printf("float    %T\n", C.f)
        fmt.Printf("double   %T\n", C.d)
    }
    
    输出:
    int      main._Ctype_int
    char     main._Ctype_char
    char[30] [30]main._Ctype_char
    float    main._Ctype_float
    double   main._Ctype_double
    

    C -> GO

    int,float,double,char类型变量可以直接强转
    
    // 转换 C 字符串到 Golang 字符串
    func C.GoString(*C.char) string
    
    // 转换一定长度的 C 字符串到 Golang 字符串
    func C.GoStringN(*C.char, C.int) string
    
    // 对于C字符串数组变量,没有办法直接用C.GoString()和C.GoStringN()直接转换,可以使用chart*替代字符串数组变量的使用
    

    GO -> C

    对于int,float,double,char可以直接强转赋值
    char*使用C.CString()
    

    3)GO语言传值到C语言

    package main
    /*
    #include <stdio.h>
    int a = 1;
    float f = 1.2;
    double d = 1.3;
    char c = '1';
    char* s = "12345";
    int fun1(int a, char c, float f, double d,char *s) {
        printf("%d %c %f %f %s\n", a, c, f, d, s);
    }
     */
    import "C"
    
    func main() {
        C.fun1(1, 'a', 1.2, 1.5, C.CString("dsadsad"))
    }
    

    三、相关资料
    1)https://www.kancloud.cn/wizardforcel/gopl-zh/106479
    2)https://studygolang.com/articles/8106
    3)https://studygolang.com/articles/3190

    相关文章

      网友评论

        本文标题:CGO编程

        本文链接:https://www.haomeiwen.com/subject/ezimaftx.html