Python調(diào)用golang代碼詳解
有些時候因為效率問題部分代碼會 使用Python調(diào)用go的編譯生成動態(tài)鏈接庫
go 代碼示例
//add.go package main import "C" //export Add func Add(a, b int) int { return a + b } //export Addstr func Addstr(a, b *C.char) *C.char { merge := C.GoString(a) + C.GoString(b) return C.CString(merge) } // go build -buildmode=c-shared -o add.so add.go func main() { }
注意 需要注意的是,這里的注釋//export Addstr //export Add 不能省略,因為在編譯成.so文件的時候,編譯器會尋找這個注釋。同時,為了能正常編譯,我們也必須導(dǎo)入C這個包。
## 特別注意 //和export 中間不能有空格
注意: 只有int可以不需要轉(zhuǎn)換,直接在go和C直接互相調(diào)用
對于不同的類型,需要使用cgo中定義的方法轉(zhuǎn)換,具體可以參考golang-cgo文檔。
比如string需要用C.char來傳遞,C.GoString(s)可以將C.char類型轉(zhuǎn)換為string,反之C.CString可以把string類型轉(zhuǎn)為 *C.char
Python是利用ctypes來跟so模塊進行交互,其中存在著一個代碼的翻譯過程,包括數(shù)據(jù)類型的翻譯,如果需要傳參獲取接收返回值,需要在golang中將參數(shù)按照下表對應(yīng),定義成C語言的數(shù)據(jù)類型。
python,ctypes , c 對應(yīng)類型參考 python 官方文檔:https://docs.python.org/3.5/library/ctypes.html
把代碼保存為fib.go,然后我們使用如下命令進行編譯:
go build -buildmode=c-shared -o add.so add.go
這條命令指定了編譯模式為c-shared,編譯完成以后,當(dāng)前文件夾下面會生成一個add.so文件。這就是我們需要用 Python 載入的文件了。
注意: 不同平臺下編譯的add.so 不能通用,Windows下可以運行的so文件,linux下就不能運行,需要重新編譯linux的so文件
python 中調(diào)用go模塊’
# -*- coding:utf-8 -*- # @Time : 2020/9/29 # @Author : hllyzms import ctypes lib = ctypes.cdll.LoadLibrary('./add.so') result = lib.Add(2020, 1) print(result) add = lib.Addstr #調(diào)用go模塊 # 顯式聲明參數(shù)和返回的期望類型 add.argtypes = [ctypes.c_char_p, ctypes.c_char_p] add.restype = ctypes.c_char_p str1 = add("abc".encode("utf-8"),'efg'.encode("utf-8")) print(str1,type(str1))
結(jié)果:
2021
b'abcefg' <class 'bytes'>
注意 Addstr 傳入測參數(shù)要轉(zhuǎn)換成byte類型
go中的*C.char 對應(yīng) ctypes 中的c_char_p 對應(yīng)Python中的bytes object or None
Python與Go之間的參數(shù)傳遞, 處理非INT型時需要都轉(zhuǎn)為對應(yīng)的C類型
ctypes需要顯式地聲明DLL函數(shù)的參數(shù)和返回期望的數(shù)據(jù)類型
注意在Python3中字符串bytes和string的區(qū)別
Go模塊需要//export 聲明外部可調(diào)用
Go處理C的類型是需要顯式轉(zhuǎn)換
以上就是Python調(diào)用golang代碼詳解的詳細內(nèi)容,更多關(guān)于Python調(diào)用golang的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Gradio機器學(xué)習(xí)模型快速部署工具quickstart
這篇文章主要為大家介紹了Gradio機器學(xué)習(xí)模型快速部署工具quickstart,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
這篇文章主要為大家介紹了python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05關(guān)于Django ForeignKey 反向查詢中filter和_set的效率對比詳解
今天小編就為大家分享一篇關(guān)于Django ForeignKey 反向查詢中filter和_set的效率對比詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12