cgo的效率 golang_golang CGO FAQ TIPS : cgo 从 C 传递 slice 到 go

cgo 从 C 传递 slice 到 go

这里一般会用在c的callback中。

需要加一个wrapper,比直接调用go函数中间多了一个转换步骤,但方便了许多。

执行流程为,c调用发起 -> c wrapper -> go export

.go:

//export a_function_callback

func a_function_callback(args []C.astruct) {}

.c:

extern void a_function_callback(GoSlice args);

void a_function_callback_c(args *C.astruct) {

GoSlice args_go;

args_go.data = args;

args_go.len = nargs;

args_go.cap = nargs;

return a_function_callback(args_go);

}

这里的GoSlice需要从 export 出来的 .h 中获取,或者 include 该 .h文件。

也可以直接拷贝过来,注意不要产生类型冲突。

#ifndef GO_CGO_PROLOGUE_H

#define GO_CGO_PROLOGUE_H

typedef long long GoInt64;

typedef GoInt64 GoInt;

typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

#endif

C.CString 的自动化回收方法

一般使用 C.CString 时,定义一个临时变量存储结果,使用 defer C.free 回收这个临时的变量。

在 go 的 runtime 包中,有一个SetFinalizer方法,可以在回收对象的时候调用一个处理函数。

那么我们可以考虑使用它来自动化回收 C.CString产生的临时变量。

type CString struct {

Ptr *C.char

}

func CCString(s string) *CString {

p := C.CString(s)

this := &CString{Ptr: p}

runtime.SetFinalizer(this, freeCString)

return this

}

func freeCString(cs *CString) {

C.free(unsafe.Pointer(cs.Ptr))

}

在使用的时候,基本能嵌入到调用的位置,不需要显式定义一个临时变量并执行 defer C.free。

C.somefunc(CCString(s).Ptr)

注意,只在somefunc不接管传递的参数的所有权时调用这种方式,如果somefunc接管了所有权,

而在未来某时间内存被回收了,则会出现程序SEGFAULT崩溃。

这种可能会产生一点runtime效率损失,另外还有额外的内存分配,看情况使用。

bool 类型的转换处理

在 C 语言中,c99之前 bool 都是定义为 int的,要想转换为go的bool类型,比较曲折。

var bval_c C.GBoolean

var bval_go bool

if int(bval) == 1 {

bval_go = true

} else {

bval_go = false

}

如果go有三元运算符的话,也可一行代码实现该转换,问题是go没有三元运算符。

一般来说,对其包装一个简单的转换函数比较好,比如 c2gobool(C.GBoolean).

有时候不同的 C 项目中 bool 定义不同,所以一般需要为每个项目定义这么一个函数,而不能放在一个库中共用。

在 c99 之后,则没有这个问题,cgo能够直接判断是内置的bool类型,能够直接转换为go的bool。

var bval_c C._Bool

var bval_go = bool(bval_c)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 图片印章_php工具型代码之印章抠图

能将白底红字的印章抠出来,用的是php,框架是laravel,其他框架请自行调节。扣其他颜色也可以,把里面的那段rgb参数判断改改就行了,最后抠出来的效果就是白底变透明,然后只留下红色的章,放在其他页…

vb mysql_VB连接MYSQL实例

VB连接MYSQL实例电脑需安装数据库mysql server和mysql connector net相关版本软件。在工程的‘项目’-‘添加引用’中添加引用‘mysql.data’实现代码如下:Imports System.IOImports SystemImports System.DataImports System.Windows.FormsImports MySql.Data.MySq…

c web mysql数据库_C连接Mysql数据库代码

//vc工具中添加E:\WAMP\BIN\MYSQL\MYSQL5.5.8\LIB 路径//在工程设置-》链接》库模块中添加 libmysql.lib#include #include #include #include #include "E:\wamp\bin\mysql\mysql5.5.8\include\mysql.h"void main(){MYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;char …

ext 如何判断是否是整数_Excel表格技巧—如何用ISNUMBER判断是否是数值

在EXCEL的单元格中,有些单元格为填写的不是数值,在某些情况下,会影响计算结果,例如,以下的表格中,红框内的单元格一个是输入了一个空格,另一个“—”符号,后面平均值的计算未将该单元…

ensp安装对电脑配置要求高吗_直线导轨有哪些安装方法?为什么直线导轨安装精度要求高?...

要点:1、为什么直线导轨安装精度要求高;2、直线导轨的安装流程;3、直线导轨不同安装方法介绍。点击链接加入群聊【solidworks机械设计学习】:正在跳转​jq.qq.comhttps://www.zhihu.com/video/1197242052088516608

mysql查看版本号_十分钟了解MySQL事务机制

读书百遍其义自现。MySQL数据库在我们平时工作学习中的使用频率是相当之高,彻底掌握MySQL的事务机制对我们平时工作会有非常大的帮助,仔细回忆一下,你是否对MySQL事务相关的知识是否完全掌握?是否感觉有的地方有些模糊&#xff1f…

mysql 字符串类型 分区_MySQL分区类型

博文大纲:1、RANGE分区2、LIST分区3、HASH分区4、key分区5、MySQL分表和分区的区别6、附加:如何实现将分区放在不同的目录下进行存储MySQL分区类型如下:RANFGE分区LIST分区HASH分区key分区上面的四种分区的条件必须是整形,如果不是…

h5获取http请求头_nodejs 中http请求头,响应头

-------------------- 1.request常见的属性 -----------------------var httprequire("http");var serverhttp.createServer(); //创建服务器server.on("request",function(req,res){// request.headers 打印全部请求头信息--对象形式// request.rawHeader…

mysql邮箱认证_邮件服务系列postfix+sasl+mysql实现用户认证功能

1、卸载bind[rootmail ~]# rpm -e bind-utils2、安装bind97-utils bind97-libs bind97[rootmail ~]# yum install bind97 bind97-utils #bind97-libs依赖于utils3、启动dns服务[rootmail ~]# service named start4、编写配置文件和区域数据文件[rootmail ~]# vim /etc/named.…

python多进程队列中的队列_python 多进程队列数据处理详解

我就废话不多说了,直接上代码吧!# -*- coding:utf8 -*-import paho.mqtt.client as mqttfrom multiprocessing import Process, Queueimport time, random, osimport camera_person_numMQTTHOST "172.19.4.4"MQTTPORT 1883mqttClient mqtt.…

UOS nginx

 安装 nginx 软件包;  配置文件名为 ispweb.conf,放置在/etc/nginx/conf.d/目录下;  网站根目录为/mut/crypt(目录不存在需创建);  启用 FastCGI 功能,让 nginx 能够解析 php 请求&a…

mysql数据库重做日志文件_mysql数据库重做日志

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

mysql免安装如何改密码_mysql免安装版配置与修改密码的教程

第一步:配置环境变量(我的解压路径:G:\mysql\mysql-5.7.21-winx64 )MYSQL_HOME你解压的路径PATH ;%MYSQL_HOME %\bin;PATH变量是在原来的基础上多添加的,不要把其它的设置给删掉了第二步在解压的目录下添加my.ini 文件(如果已经有了这个文件&#xff0c…

unix 登录mysql_实例分析mysql用户登录。

今天,在学习mysql授权认证时,遇到了一个问题,看下,我是如何分析的:我在数据库内添加了一个帐号:create databases firstdb;grant all on firstdb.* to ‘firstdb’’’ identified by ‘xxxxx’;flush priv…

拉普拉斯时域卷积定理_如何证明频域卷积定理

展开全部设抄IF表示傅立叶逆变换,则因此有袭故频域卷积定2113理5261得证。4102扩展资料频域卷积定理频域卷积定理表明两信号1653在时域的乘积对应于这两个信号傅立叶变换的卷积除以2π。卷积定理揭示了时间域与频率域的对应关系。这一定理对Laplace变换、Z变换、Mel…

suse查看mysql内存使用情况_MySQL 慢查询日志(Slow Query Log)

4、格式化慢查询日志结构化慢查询日志就是把慢查询日志中的重要信息按照便于阅读以及按照特定的排序方式来提取SQL。这种方式有点类似于Oracle中有个tkprof来格式化oracle的trace文件。对于前面的慢查询日志我们使用MySQLdumpslow来提取如下:SUSE11b:~ # mysqldumps…

mysql按照学生分组查询_将student表按照gender字段值进行分组查询,并计算每个分组中有多少名学生_学小易找答案...

【简答题】查询student表中一共有多少条记录【简答题】在department表和employee表之间分别使用where查询、自连接查询【简答题】使用DESC查看学生表和班级表【简答题】在表student和表grade中添加外键约束,建立两个表的关联关系【简答题】在department表和employee表之间使用右…

python 解方程 sympy_用Python和Sympy求解方程并得到数值答案

我正试图用sympy来解决方程,但我想得到一个直接的数字答案 . 我的脚本是这样的:from sympy import *A,B,Vsymbols(A,B,V)eq1Eq(630.26*(V-39.0)*V*(V39)-AB,0)eq2Eq(B,1.36*10**8*(V-39))eq3Eq(A,5.75*10**5*V*(V39.0))solve([eq1,eq2,eq3], [A,B,V], di…

mysql 分析服务_MySQL分析服务器状态_MySQL

概述文章简单介绍了通过一些查询命令分析当前服务器的状态。目录概述获取服务器整体的性能状态SQL操作计数总结步骤获取服务器整体的性能状态首先对一个数据库服务器进行性能优化需要先知道服务器当前主要的性能问题出现在哪里,在这点sql server也是类似&#xff0c…

apache启服务命令_Linux系统重启apache服务命令详解

Linux系统中apache是重要的一个服务,掌握基本操作尤其重要。下面由学习啦小编为大家整理了Linux系统重启apache服务命令详解,希望对大家有帮助!Linux系统重启apache服务命令详解基本的操作方法:本文假设你的apahce安装目录为/usr/local/apach…