golang与C交互:cgo
2016-09-07 13:19
106 查看
1. 在Go中引用C代码很简单, 在 import "C"前用注释引入标准的C代码, 然后使用C.xxx的伪包引用C代码空间的标识符即可. 需要注意, import"C"是伪package,不能与其他package一块定义为import (..."C"...)
2. 在Go中引用C代码必须手工释放C代码对象. 释放方法为C.free(unsafe.Pointer(xxx)), 这也要求C代码包含#include <stdlib.h>
3. 必须深入理解下述:
(1) Cgo recognizes this comment above import "C" statement.
(2) Any lines starting with #cgo followed by a space character are removed; these become directives for cgo.
(3) The remaining lines are used as a header when compiling the C parts of the package.
------------------------------------
通俗记忆:
(1)cgo能够识别import "C" 语句的注释.
(2)#cgo行用作cgo指令
(3)其他行用作C头文件
第(2)点很关键! 容易导致重复定义.
实践问题:
代码段1:
-------------------------------
package main
/*
#include <stdlib.h>
#include "prints.h"
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
msg := "this is a test for"
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
C.prints(cmsg)
fmt.Println("done...")
}
//在main包中引入C代码, 使用go run xxx.go会报错. 先go build-->再执行, 无错误.
-------------------------------------
上面解决办法,是定义wrapper把C代码封装起来. 例如:
package myc
/*
#include <stdlib.h>
#include "prints.h"
*/
import "C"
import "unsafe"
func Cprints(msg string) {
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
C.prints(cmsg)
}
-------------------------------------------------
2. 在Go中引用C代码必须手工释放C代码对象. 释放方法为C.free(unsafe.Pointer(xxx)), 这也要求C代码包含#include <stdlib.h>
3. 必须深入理解下述:
(1) Cgo recognizes this comment above import "C" statement.
(2) Any lines starting with #cgo followed by a space character are removed; these become directives for cgo.
(3) The remaining lines are used as a header when compiling the C parts of the package.
------------------------------------
通俗记忆:
(1)cgo能够识别import "C" 语句的注释.
(2)#cgo行用作cgo指令
(3)其他行用作C头文件
第(2)点很关键! 容易导致重复定义.
实践问题:
代码段1:
-------------------------------
package main
/*
#include <stdlib.h>
#include "prints.h"
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
msg := "this is a test for"
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
C.prints(cmsg)
fmt.Println("done...")
}
//在main包中引入C代码, 使用go run xxx.go会报错. 先go build-->再执行, 无错误.
-------------------------------------
上面解决办法,是定义wrapper把C代码封装起来. 例如:
package myc
/*
#include <stdlib.h>
#include "prints.h"
*/
import "C"
import "unsafe"
func Cprints(msg string) {
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
C.prints(cmsg)
}
-------------------------------------------------
相关文章推荐
- Golang 和 MongoDB 中的 ISODate 时间交互问题
- golang 结合cgo 操作共享内存,包括虚拟内存mmap版和内存shm版
- Go语言学习之cgo(golang与C语言相互调用)
- CGO,GOLANG调用C库,调用代码、静态库或动态库
- golang之cgo---类型转换小试牛刀之C结构体和go结构体转换
- golang的cgo支持调用C++的方法
- Golang的交互模式进阶-读取用户的输入
- Golang与DLL交互
- Go语言练习:go语言与C语言的交互——cgo
- golang(cgo)---如何在两个不同的package中使用同样的自定义数据类型?
- golang在window环境下用cgo编译c语言
- cgo的一些经验. golang 调用 so 方法
- golang表单提交与服务器的交互
- go语言(使用了cgo与硬件交互),算上空行和注释共200行代码
- golang新版本对于cgo支持的一个坑
- golang之cgo---调用C/C++动态库函数
- golang1.8使用cgo获取进程是否假死
- cgo 随笔(golang)
- 使用golang和docker守护进程交互
- golang学习记录之Cgo