Python調(diào)用golang代碼詳解
有些時(shí)候因?yàn)樾蕟栴}部分代碼會(huì) 使用Python調(diào)用go的編譯生成動(dòng)態(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 不能省略,因?yàn)樵诰幾g成.so文件的時(shí)候,編譯器會(huì)尋找這個(gè)注釋。同時(shí),為了能正常編譯,我們也必須導(dǎo)入C這個(gè)包。
## 特別注意 //和export 中間不能有空格
注意: 只有int可以不需要轉(zhuǎn)換,直接在go和C直接互相調(diào)用
對(duì)于不同的類型,需要使用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模塊進(jìn)行交互,其中存在著一個(gè)代碼的翻譯過程,包括數(shù)據(jù)類型的翻譯,如果需要傳參獲取接收返回值,需要在golang中將參數(shù)按照下表對(duì)應(yīng),定義成C語言的數(shù)據(jù)類型。
python,ctypes , c 對(duì)應(yīng)類型參考 python 官方文檔:https://docs.python.org/3.5/library/ctypes.html

把代碼保存為fib.go,然后我們使用如下命令進(jìn)行編譯:
go build -buildmode=c-shared -o add.so add.go
這條命令指定了編譯模式為c-shared,編譯完成以后,當(dāng)前文件夾下面會(huì)生成一個(gè)add.so文件。這就是我們需要用 Python 載入的文件了。
注意: 不同平臺(tái)下編譯的add.so 不能通用,Windows下可以運(yùn)行的so文件,linux下就不能運(yùn)行,需要重新編譯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 傳入測(cè)參數(shù)要轉(zhuǎn)換成byte類型
go中的*C.char 對(duì)應(yīng) ctypes 中的c_char_p 對(duì)應(yīng)Python中的bytes object or None
Python與Go之間的參數(shù)傳遞, 處理非INT型時(shí)需要都轉(zhuǎn)為對(duì)應(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代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Python調(diào)用golang的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python將pandas datarame保存為txt文件的實(shí)例
今天小編就為大家分享一篇python將pandas datarame保存為txt文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Python實(shí)現(xiàn)電視里的5毛特效實(shí)例代碼詳解
這篇文章主要介紹了Python實(shí)現(xiàn)了電視里的5毛特效,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Python使用matplotlib繪制正弦和余弦曲線的方法示例
這篇文章主要介紹了Python使用matplotlib繪制正弦和余弦曲線的方法,結(jié)合實(shí)例形式分析了Python調(diào)用matplotlib庫進(jìn)行圖形繪制想具體操作技巧,需要的朋友可以參考下2018-01-01
pytorch中.to(device) 和.cuda()的區(qū)別說明
這篇文章主要介紹了pytorch中.to(device) 和.cuda()的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
基于Python實(shí)現(xiàn)一個(gè)PDF特殊字體提取工具
在PDF文檔處理場(chǎng)景中,我們常常需要針對(duì)特定格式的文本內(nèi)容進(jìn)行提取分析,本文介紹的"PDF特殊字體提取器"是一款基于Python開發(fā)的桌面應(yīng)用程序感興趣的小伙伴跟著小編一起來看看吧2025-03-03
Python保存數(shù)據(jù)到文件的實(shí)現(xiàn)方式
這篇文章主要介紹了Python保存數(shù)據(jù)到文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
超詳細(xì)圖解修改pip?install默認(rèn)安裝路徑的方法
windows環(huán)境下Python pip安裝庫的時(shí)候,默認(rèn)安裝在c盤,下面這篇文章主要給大家介紹了關(guān)于修改pip?install默認(rèn)安裝路徑的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python PyCharm如何進(jìn)行斷點(diǎn)調(diào)試
這篇文章主要介紹了Python PyCharm如何進(jìn)行斷點(diǎn)調(diào)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

