1.查看cgo是否开启
go env  | grep CGO_ENABLED
CGO_ENABLED='1' 
2. go程序中加入 import "C"
通过 import “C” 语句启用 CGO 特性后,CGO 会将上一行代码所处注释块的内容视为 C 代码块
单行注释使用//
 多行注释使用/*   */
3. go 与C 类型转换
在go安装目录 src\cmd\cgo 中定义
func C.CString(string) *C.char
func C.CBytes([]byte) unsafe.Pointer
func C.GoString(*C.char) string
func C.GoStringN(*C.char, C.int) string
func C.GoBytes(unsafe.Pointer, C.int) []byte 
GO语言与C语言的数据类型对应表

3. 直接在go文件中使用函数
package main
/*
#include <stdio.h>
int printHello(const char *str){
    printf("%s\n",str);
    return 3;
}
*/
import "C"
import (
	"fmt"
)
func main() {
	fmt.Println("Hello World!")
	fmt.Println(C.printHello(C.CString("nihao")))
} 
4.使用动态库
myprint.c
#include "myprint.h"
#include <stdio.h>
int printHello(const char *str){
    printf("%s\n",str);
    return 3;
} 
myprint.h
#ifndef __MYPRINTF_H
int printHello(const char *str);
#endif 
编译动态库
gcc -fPIC -shared -o libmyprint.so myprint.c 
将编译后的动态库拷贝至系统lib路径 ,或者自定义路径下 然后修改/etc/ld.so.conf
执行ldconfig
使用动态库序号包含3行
#cgo CFLAGS: -ImyLibIncPath
 #cgo LDFLAGS:  -LmyLibIncPath -lmyprint
 #include "myprint.h"
package main
/*
#cgo CFLAGS: -I./
#cgo LDFLAGS: -L./ -lmyprint
#include "myprint.h"
*/
import "C"
import (
	"fmt"
)
func main() {
	fmt.Println("Hello World!")
	fmt.Println(C.printHello(C.CString("nihao")))
} 
 
5.go与c数据转换可以参考
https://www.cnblogs.com/zhaoyingjie/p/15683384.html



















