利用 Go 和 C 语言的交互,我们可以写 go 的 c 扩展。
新建一个文件 greeter.h
, 保存内容如下:
#ifndef _GREETER_H
#define _GREETER_H
int greet(const char *name, int year, char *out);
#endif
新建一个文件 greeter.c
, 保存内容如下:
#include "greeter.h"
#include <stdio.h>
int greet(const char *name, int year, char *out) {
int n;
n = sprintf(out, "Greetings, %s from %d! We come in peace :)", name, year);
return n;
}
新建一个文件 greeter.go
, 保存内容如下:
package main
// #cgo CFLAGS: -g -Wall
// #include <stdlib.h>
// #include "greeter.h"
import "C"
import (
"fmt"
"unsafe"
)
func main() {
name := C.CString("Gopher")
defer C.free(unsafe.Pointer(name))
year := C.int(2018)
ptr := C.malloc(C.sizeof_char * 1024)
defer C.free(unsafe.Pointer(ptr))
size := C.greet(name, year, (*C.char)(ptr))
b := C.GoBytes(ptr, size)
fmt.Println(string(b))
}
这一有个注意事项:跟 C
相关的一定要放在 import "C"
上面。
我之前就是没有放上面,一直没成功。
网友评论