golang與C有著千絲萬縷的聯(lián)系叽躯,go代碼中可以調(diào)用C代碼
由于項(xiàng)目需要财边,新使用的golang語言需要調(diào)用C語言寫的加解密函數(shù),所以用到了cgo险毁,在此記錄一點(diǎn)使用心得
如何調(diào)C代碼
非常簡單制圈,只需要兩步
- 在golang代碼開始部分(
package xxx
之后),添加注釋畔况,注釋中編寫需要使用的C語言代碼 - 緊挨著注釋結(jié)束鲸鹦,另起一行增加
import "C"
,注意跟注釋中的C代碼緊挨跷跪,不要有空行馋嗜,且不要跟其他golang的import放在一起
這樣在golang語言的正文中就可以用C.xxx
的方式調(diào)用注釋中的C代碼了
demo
package main
// #include <stdio.h>
// #include <stdlib.h>
/*
void print(char *s) {
printf("print used by C language:%s\n", s);
}
*/
import "C" //和上一行"*/"直接不能有空行或其他注釋
import "unsafe"
func main() {
s := "hello"
cs := C.CString(s)
defer C.free(unsafe.Pointer(cs))
C.print(cs)
}
原理
其實(shí)cgo就是先由編譯器識(shí)別出import "C"的位置,然后在其上的注釋中提取C代碼吵瞻,最后調(diào)用C編譯器進(jìn)行分開編譯
keypoint
使用cgo要點(diǎn)我覺得有兩個(gè)
- golang和C直接的類型轉(zhuǎn)換
- 靜態(tài)庫和動(dòng)態(tài)庫的鏈接
補(bǔ)充一點(diǎn)當(dāng)時(shí)業(yè)務(wù)中遇到的問題葛菇,要鏈接的動(dòng)態(tài)庫文件,不知道相對(duì)路徑怎么取橡羞,后來找到了解決辦法:${SRCDIR}
When the cgo directives are parsed, any occurrence of the string ${SRCDIR} will be replaced by the absolute path to the directory containing the source file.
package aes
/*
#cgo LDFLAGS: -L${SRCDIR} -lyourfile -ldl
#include <stdio.h>
#include <stdlib.h>
#include "yourcode.h"
*/
import "C"
......
掌握了這兩點(diǎn)眯停,應(yīng)該就夠用了,具體細(xì)節(jié)就不在這里寫了卿泽,請(qǐng)參考官方文檔
Reference
http://cholerae.com/2015/05/17/%E4%BD%BF%E7%94%A8Cgo%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%93/