golang和python互相调用
http://blog.yuanzhaoyi.cn/2018/06/27/golang_python.html
python3-ctypes: https://docs.python.org/3.5/library/ctypes.html#ctypes.c_wchar_p
golang-cgo: https://golang.org/cmd/cgo/#hdr-Go_references_to_C
综述
golang和python之间,当前可以通过golang的cgo和python的ctypes,把golang对象和python对象分别转换为C对象,从而通过编译和调用c的动态连接库,完成交互。
python调用golang:
go 函数实现:
//libadd.go
package main
import "C"
//export add
func add(left, right int) int {
    return left + right
}
func main() {
}
通过c-shared模式编译成so:
go build -buildmode=c-shared -o libadd.so libadd.go
python调用so:
from ctypes import cdll
lib = cdll.LoadLibrary('./libadd.so')
print("Loaded go generated SO library")
result = lib.add(2, 3)
print(result)
注意: 只有int可以不需要转换,直接在go和C直接互相调用
对于不同的类型,需要使用cgo中定义的方法转换,具体可以参考golang-cgo文档。
比如string需要用C.char来传递,C.GoString(s)可以将C.char类型转换为string,反之C.CString可以把string类型转为 *C.char
使用举例:
package main
import "C"
import (
	"github.com/ppmoon/gbt2260"
	"strings"
)
//export parsecode
func parsecode(s *C.char) (*C.char){
	code := C.GoString(s)
	region := gbt2260.NewGBT2260()
	localCode := region.SearchGBT2260(code)
	if len(localCode) < 3 {
		return C.CString("没有匹配上,,")
	}
	ret := strings.Join(localCode, ",")
	return C.CString(ret)
}
//export add
func add(left, right int) int {
	return left + right
}
func main() {
}
编译.so:
go build -buildmode=c-shared -o ~/Develop/law_dev/law_service/util/parseareacode.so test_other.go
python调用:
用.argtype和.restype可以定义调用动态连接库函数的传入和传出参数
# 通过golang的"github.com/ppmoon/gbt2260"包解析area code
import os
from ctypes import cdll, c_char_p
current_path = os.path.dirname(os.path.realpath(__file__))
lib = cdll.LoadLibrary(current_path + '/parseareacode.so')
parsecode = lib.parsecode
def get_list(area_code):
    parsecode.argtype = c_char_p
    parsecode.restype = c_char_p
    result = lib.parsecode(area_code.encode("utf-8"))
    return result.decode("utf-8").split(",")
简单总结
Python与Go之间的参数传递, 处理非INT型时需要都转为对应的C类型
ctypes需要显式地声明DLL函数的参数和返回期望的数据类型
注意在Python3中字符串bytes和string的区别
Go模块需要//export 声明外部可调用
Go处理C的类型是需要显式转换golang和python互相调用的更多相关文章
- DES对称加密算法实现:Java,C#,Golang,Python
		数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ... 
- python子类调用父类的方法
		python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ... 
- Python之调用函数
		Python之调用函数 Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数. 可以直接从Python的官方网站查 ... 
- Python下调用Linux的Shell命令
		有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ... 
- Python脚本传參和Python中调用mysqldump
		Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ... 
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang  python  php c++ java Nodejs Performance)
		2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ... 
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]
		2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集. 上篇传送门: 2017年的golang.python.p ... 
- golang与python多线程的并发速度
		一.golang的代码 package main import ( "fmt" "time" ) func Text_goroute(a int, b int) ... 
- python 可调用对象之类实例
		可调用对象,即任何可以通过函数操作符()来调用的对象. python可调用对象大致可以分为4类: 1.函数 python中有三种函数:内建函数(BIFs).用户自定义函数(UDF).lambda表达式 ... 
随机推荐
- 【搜索】N皇后问题
			原题传送门 思路 很经典的搜索题,但本蒟蒻卡了1个多小时,搜索部分很简单,但是判重的部分是真的蛋疼,我写了一个高效率的判重算法,但是无论检查多少遍都没有问题的算法却总是WA......后来我干脆写了一 ... 
- 一文读懂前端技术演进:盘点Web前端20年的技术变迁史
			本文原文由作者“司徒正美”发布于公众号“前端你别闹”,即时通讯网收录时有改动,感谢原作者的分享. 1.引言 1990 年,第一个Web浏览器的诞生:1991 年,WWW诞生,这标志着前端技术的开始. ... 
- python-1-基础认识
			前言 将近2020年,python2即将不再更新,但是我们现在的python3也能非常受欢迎的!回顾一下2/3的区别: 1.python2 源码不标准,混乱,重复代码太多, 2.python3 统一 ... 
- D3力布图绘制--基本方法
			本文主要结合案例记录使用D3.js绘制力布图的基本方法 样例显示 基本配置 this.force = d3.layout .force() .size([this.width, this.height ... 
- mysql 写计数器需要注意的问题
			MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能 由于并发的时候 不能同时写入一行数据 所以要分开写<pre>先创建表CREATE TABLE `article_view` ... 
- 【大数据】SparkSql 连接查询中的谓词下推处理 (二)
			本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/II48YxGfoursKVvdAXYbVg作者:李勇 目录:1.左表 join 后条件下推2.左表j ... 
- CodeForce 117C Cycle DFS
			A tournament is a directed graph without self-loops in which every pair of vertexes is connected by ... 
- sitecore系列教程场所分类简介
			在Sitecore体验平台(XP)中,场所是可跟踪的离线交互发生的位置.这些是发生交互的物理位置,例如特定的零售场所或公共汽车站. 您可以使用场所分类记录特定交互发生的位置.此信息保存在体验数据库(x ... 
- Django学习笔记(17)——BBS+Blog项目开发(1)验证码功能的实现
			本文主要学习验证码功能的实现,为了项目BBS+Blog项目打下基础. 为了防止机器人频繁登陆网站或者破坏分子恶意登陆,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是“Com ... 
- 【UOJ#22】【UR #1】外星人(动态规划)
			[UOJ#22][UR #1]外星人(动态规划) 题面 UOJ 题解 一道简单题? 不难发现只有按照从大往小排序的顺序选择的才有意义,否则先选择一个小数再去模一个大数是没有意义的. 设\(f[i][j ... 
