Go语言中导入C语言
方法
- Go语言中导入C语言都需要单行注释和多行注释注释起来
- 在C语言紧随其后的位置编写" import " C " , 中间不能有任何别的代码
- 这样go语言就可以访问C语言的函数了,C.函数名
package main
/**
#include <stdio.h>
void say(){
printf("Hello World\n");
}
*/
import "C"
func main() {
C.say()
}
C语言访问go语言的函数(理解)
- 如果C语言需要调用Go语言函数,那么需要在对应的Go语言文件里导入"import "C"
- 在需要被C语言调用的GO语言函数上需要导出函数 export + go语言函数名称
//export sum
func sun(a,b int)(res int){
res = a + b
return
}
- 在C语言中也需要导入函数的声明 extern go语言函数返回值类型 + 函数名称(形参列表)
/ **
#include <stdio.h>
void say(){
extern int sum(a,b int); // C语言声明函数格式
}
** /
import "C"
-
注意点
C语言函数和所调用的函数不能在同一个文件里
Go语言使用C语言的数据
方式
- 通过C.变量名称的方式可以访问C语言的变量
package main
/ *
#include <stdio.h>
int num = 666;
char ch = 'a';
double value = 3.14;
*/
import "C"
import "fmt"
func main() {
fmt.Println(C.num)
fmt.Println(C.ch)
fmt.Println(C.value)
}
Go语言使用C语言字符串
-
Go语言使用C语言的字符串的方法
C.GoString(str)
-
C语言使用Go语言的字符串的方法
C.CString(str)
package main
/**
#include <stdio.h>
char *str = "www.jianshu.com"
*/
import "C"
import "fmt"
func main() {
var str1 string;
str1 = C.Gostring(C.str1)
fmt.Println(str1)
}
- 注意点
- 不能使用Gostring的方法将C语言的数组转换为go语言的字符串
- 如果将一个go语言的字符串转换为C语言的字符串之后这个字符串将不受go语言的垃圾回收机制的控制
-
需要手动释放
C.free( unsafe.Pointer(str) )
Go语言使用C语言的指针
package main
/ **
#include <stdio.h>
int num = 666;
int *p = &num
*/
import "C"
import "fmt"
func main() {
var p1 *C.int = C.p
fmt.Println(*p1) // 访问
}
- 注意点
- 其他数据类型都可以使用以上格式来表示
- 但是void *类型,必须使用go语言中的unsafe.Pointer来保存
package main
/ **
#include <stdio.h>
void *p = &num
*/
import "C"
import "fmt"
func main() {
var p1 unsafe.Pointer = C.p
fmt.Println(p1) // 访问
}
Go语言使用C语言的枚举
- 格式
- go语言访问C语言的枚举和访问普通变量一样,通过C.枚举值 的方式
- C语言中的枚举类型 在go语言中对应的是 enum_枚举类型名称
package main
/ *
#include <stdio.h>
enum Gender{
GenderWomen
GEnderMan
}
*/
import "C"
import "fmt"
func main() {
var gender C.enumGender = C.GenderMan
fmt.Println(gender)
}
Go语言使用C语言的结构体
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)
}
-
注意点
如果结构体属性是复杂类型, 可能会有问题
Go语言使用C语言的数组
package main
/**
#include <stdio.h>
int arr[5] = {1,2,3,4,5};
*/
import "C"
import "fmt"
func main() {
var arr [5]C.int = C.arr
fmt.Println(arr)
fmt.Println(arr[0])
}