19-Go语言和C语言交叉访问

2018-10-01  本文已影响0人  喝酸奶要舔盖__

Go语言访问C语言

书写C语言代码
package main
/*
#include <stdio.h>

void say(){
    printf("我是C语言程序\n");
}
*/
import "C"

func main() {
     C.say()
}
访问C语言数据
package main

/*
#include <stdio.h>
char ch  = 'b';
int num = 10;
double value = 3.14;

*/
import "C"
import "fmt"

func main() {
    //访问C语言中的数据
    fmt.Println(C.ch)
    fmt.Println(C.num)
    fmt.Println(C.value)

    fmt.Printf("%T\n", C.ch) //main._Ctype_char
    fmt.Printf("%T\n", C.num)  //main._Ctype_int
    fmt.Printf("%T\n", C.value) //main._Ctype_double

    //是否可以直接赋值给Go语言中的变量
    var ch byte
    //数据类型不同不能直接赋值,需要显示转换
    ch = byte(C.ch)
    fmt.Println(ch)

    var num int
    num = int(C.num)
    fmt.Println(num)

    var value float32
    value = float32(C.value)
    fmt.Println(value)
}

访问C语言字符串
package main
/*
#include <stdio.h>
include <stdlin.h>
char *str1 = "www.it666.com";
char str2[20] = "www.it666.com";


*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    //利用函数C.GoString将C语言字符串转换为Go语言字符串
    str1 := C.GoString(C.str1)
    var str2 string
    //可以赋值给字符串类型的变量
    str2  = str1
    fmt.Println(str1)
    fmt.Println(str2)

    //注意点: 不能将数组类型直接通过GoString方法转换为Go语言的字符串
    //str3 := C.GoString(C.str2)

    //需要使用这种固定格式才能转换
    str3 := C.GoString(&C.str2[0])
    fmt.Println(str3)

    //了解内容
    // 注意点: 如果将一个Go语言的字符串转换为C语言的字符串之后, 这个字符串是不受Go语言的GC控制的
    // GC 垃圾回收器
    str4 := "www.666"
    str := C.CString(str4)
    fmt.Printf("%s\n", str)
    //手动释放C语言的字符串
    C.free(unsafe.Pointer(str))
}

访问C语言中指针类型
package main
/*
#include <stdio.h>
int num = 66;
int *p1 = &num;
void *p2 = &num;
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    //访问C语言中指针类型变量
    //定义变量
    var p *C.int = C.p1
    fmt.Println(*p)

    //注意点: 其它类型都可以按照上面的格式来表示
    //但是void *类型, 必须使用Go语言中的unsafe.Pointer来保存
    var p2 unsafe.Pointer = C.p2
    fmt.Println(p2)
}
访问C语言中的枚举
package main
/*
#include <stdio.h>
enum Gender{
    GenderMale,
    GenderFemale,
    GenderYao
};
*/
import "C"
import "fmt"

func main() {
    // Go语言访问C语言中的枚举和访问普通变量一样, 通过C.枚举值 方式即可
    // C语言中的枚举类型, 在Go语言中对应的是 enum_枚举类型名称
    var gender C.enum_Gender = C.GenderFemale
    fmt.Println(gender)
}

访问结构体类型
package main
/*
#include <stdio.h>
struct Point {
    float x;
    float y;
};
*/
import "C"
import "fmt"

func main() {
    // 注意点: 如果结构体属性是复杂类型, 可能会有问题
    var pi C.struct_Point = C.struct_Point{1.1,2.2}
    fmt.Println(pi.x)
    fmt.Println(pi.y)
}

访问数组类型
package main
/*
#include <stdio.h>
int arr[3] = {1,3,5};
*/
import "C"
import "fmt"

func main() {
    //访问C代码的数组
    //arr := C.arr
    var arr [3]C.int = C.arr
    fmt.Println(arr)
    fmt.Println(arr[0])
    fmt.Println(arr[1])
    fmt.Println(arr[2])
}

上一篇 下一篇

猜你喜欢

热点阅读