一、cgo
1.1 go调用c函数
知识点:
- /* */之间的是C代码。
- C代码和 import "C"之间不能有空格,否则会报错。
- import "C"必须单独一行,不能和其他的import写在一起。
代码:
package main
/*
#include <stdint.h>
static int32_t add(int32_t a, int32_t b) {
return a + b;
}
*/
import "C"
import (
"fmt"
)
func main() {
var a, b int32 = 10, 20
var c int32 = int32(C.add(C.int32_t(a), C.int32_t(b)))
fmt.Println(c)
}
运行结果:
[root@bogon 09]# go run test.go
30
1.2 go调用c静态库
代码:
hello.h:
extern int hello(char *name, int age);
hello.c:
#include <stdio.h>
#include "hello.h"
int hello(char *name, int age) {
printf("hello %s, your age is %d\n", name, age);
return age;
}
test.go:
package main
/*
#include <stdio.h>
#include <stdlib.h>
#include "hello.h"
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lhello
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
name := C.CString("Tom")
defer C.free(unsafe.Pointer(name))
age := C.int(18)
result := C.hello(name, age)
fmt.Println(result)
}
编译c代码为静态库:
gcc -Wall -c hello.c
ar -rv libhello.a hello.o
运行结果:
[root@bogon 09]# go run test.go
hello Tom, your age is 18
18