19-Go语言和C语言交叉访问
2018-10-01 本文已影响0人
喝酸奶要舔盖__
Go语言访问C语言
书写C语言代码
- C语言的代码都需要利用单行注册或者多行注释注释起来
- 在C语言代码紧随其后的位置写上import "C",就可以在go代码中通过C.函数名称 方式来访问C语言的函数
-
注意点:
- C语言代码的注释和import "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语言字符串
- 将C语言字符串转换为Go语言字符串:
C.GoString
- 将Go语言字符串转换为C语言字符串:
C.GoString
(应用不多)
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语言中指针类型
-
注意点:
void *类型, 必须使用Go语言中的unsafe.Pointer来保存
package main
/*
#include <stdio.h>
int num = 66;
int *p1 = #
void *p2 = #
*/
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])
}