当前位置: 首页 > news >正文

网站设计教程及在线模拟器/免费外贸接单平台

网站设计教程及在线模拟器,免费外贸接单平台,wordpress关闭robots,德宏网站建设​ 为了能够重用已有的 C 语言库,我们在使用 Golang 开发项目或系统的时候难免会遇到 Go 和 C语言 混合编程,这时很多人都会选择使用 cgo 。 1 Cgo ​ 话说 cgo 这个东西可算得上是让人又爱又恨,好处在于它可以让你快速重用已有的 C语言 库&a…

​ 为了能够重用已有的 C 语言库,我们在使用 Golang 开发项目或系统的时候难免会遇到 GoC语言 混合编程,这时很多人都会选择使用 cgo

1 Cgo

​ 话说 cgo 这个东西可算得上是让人又爱又恨,好处在于它可以让你快速重用已有的 C语言,无需再用 Gg 重造一遍轮子,而 坏处就在于它会在一定程度上削弱你的系统性能。关于cgo 的种种劣迹,Dave Cheney 大神在他的博客上有一篇专门的文章《cgo is not Go》。

​ 但话说回来,有时候为了快速开发满足项目需求,使用 cgo 也实在是不得已而为之。

官方示例:

package mainimport "fmt"/*
#include <stdlib.h>
*/
import "C"func Random() int {return int(C.random())
}func Seed(i int) {C.srandom(C.uint(i))
}func main() {Seed(100)fmt.Println("Random:", Random())
}

原理:

import "C" 是一个标记,告诉 Cgo 他应该开始工作了。Cgo 做的事情就是,对应这条 import 语句之前的块注释中的 C 源代码自动生成包装性质的 Go 代码。函数调用从汇编角度看,就是一个将参数按顺序压栈( push ),然后进行函数调用( call )的过程。Cgo 的代码只不过是帮你封装了这个压栈和调用的过程,从外面看起来就是一个普通的 Go 调用。

语法:

import"C" 前面需要紧贴在注释的下面。块注释还是行注释无所谓。注释中的任意合法的 C 源代码,Cgo 都给会进行相应的处理并生成对应的 Go 代码,如下所示:

package hello/*
#include <stdlib.h>
void hello() {printf("Hello, Cgo! -- Frin C world.\n");
}
*/
import "C"func Hello() int {C.hello()
}

2 关键难点

​ 跨语言交互中,比较复杂的问题有两个:类型映射 以及 跨越调用边界传递指针 所带来的对象生命周期和内存管理的问题。

2.1 类型映射

基础数据类型

C语言Go语言
signed charC.char / C.schar
unsigned charC.uchar
unsigned shortC.short / C.ushort
unsigned intC.int / C.uint
unsigned longC.long / C.ulong
long longC.longlong
unsigned long longC.ulonglong
floatC.float
doubleC.double
void*(指针)unsafe.Pointer

数据结构类型

C语言Go语言
structstruct_(前缀)
unionunion_(前缀)
enumenum_(前缀)

2.2 字符串映射

Cgo 提供了一系列函数来提供支持:C.CStringC.GoStringC.GoStringN

注意:

  • 每次转换都将导致一次内存复制
  • 无论是 C 语言还是 Go 语言都不允许对字符串的内容进行修改

内存问题

由于 C.CString 的内存管理方式与 Go 语言自身的内存管理方式不兼容,所以再使用完之后,必需要现实的释放调用 C.CSting 所产生的内存快,否则将会造成内存泄漏。示例如下:

2.3 函数调用

对于常规返回了一个值的函数,调用者可以用以下方式,顺便得到错误码:

n, err := C.atoi("1234");

在传递数组类型的参数时,在 Go 中,将第一个元素的地址作为整个数组的起始地址传入,示例如下:

n, err := C.func(&array[0]);  // 需要显示指定第一个元素的地址

2.4 C代码中依赖第三方库

​ 当需要依赖非 C 标准的第三方库时,Cgo 提供了 #cgo 这样的伪 C 文法,让开发者有机会指定依赖的第三方库和编译选项。示例如下:

// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo linux CFLAGS: -DLINUX=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"

​ 以上代码中示范了如何通过 CFLAGS 来传入编译选项,使用 LDFLAGS 来传入链接选项。更简便的 #cgo 用法如下所示:

// #cgo pkg-config: png cairo
// #include <png.h>
import "C"

​ 在 Go 中使用 cgo 调用 C 库的时候,如果需要引用很多不同的第三方库,那么使用 #cgo CFLAGS:#cgo LDFLAGS: 的方式会引入很多行代码。首先这会导致代码很丑陋,最重要的是如果引用的不是标准库,头文件路径和库文件路径写死的话就会很麻烦,一旦第三方库的安装路径变化了,Go 的代码也要跟着变化。所以使用 pkg-config 无疑是一种更为优雅的方法,不管库的安装路径有何变化,都不需要修改 Go 代码。

3 编译 Cgo

Go 安装后,自带一个 cgo 命令行工具,它用于处理所有带有 Cgo 代码的 Go 文件,生成 Go 语言版本的调用封装代码。而 Go 工具集又对 cgo 再次进行了良好的封装,所以我们不需要做任何特殊的处理。

转载于:https://www.cnblogs.com/zhance/p/10135142.html

http://www.lbrq.cn/news/817471.html

相关文章:

  • 佛山视频网站搭建公司/营销型网站建设的价格
  • 大连做公司网站哪家好/网站优化方式有哪些
  • 纯jsp做的留言板网站/哪里有免费的网站推广软件
  • 做曖視頻网站/企业网站源码
  • 大学生婚恋网站策划书/女排联赛最新排行榜
  • 商城网站建设信息/千万别手贱在百度上搜这些词
  • 上海正规做网站公司电话/seo外包公司优化
  • wordpress 搬瓦工迁移/seo是什么技术
  • 石岩做网站哪家好/整合营销案例
  • 外贸营销软件/搜索引擎优化原理
  • 网站的c4d动画是怎么做的/关键词在线试听
  • 拖拽建站 wordpress/微信公众号小程序怎么做
  • 香港网站空间租用哪个好/网站推广基本方法是
  • 销售网站建设怎么样/对网站外部的搜索引擎优化
  • 营销型网站建设需要懂什么/中国宣布取消新冠免费治疗
  • 黄山网站建设公司/平台推广是什么意思
  • 禹城做网站的公司/最新新闻热点事件2022
  • 如何做团购网站中的美食地处地图功能/百度安全中心
  • 做网站哪/快速排名上
  • 做电影网站的资源从哪里换/bing搜索引擎
  • 重庆产品推广类网站/整合营销的特点有哪些
  • 网站建设哪家效果好/怎样把广告放到百度
  • rp如何做网站/合肥网站优化推广方案
  • 长沙雨花区建设局网站/赣州是哪个省
  • 太原网站建设baidu/营销网络的建设
  • 湘潭做网站价格 q磐石网络/百度一下你就知道百度首页
  • 郑州企业网站建设公司/商丘seo
  • 网站软文设计/网站权重是什么意思
  • element ui设计网站/做搜索引擎推广多少钱
  • app开发制作教程/seo诊断工具
  • 嵌入式硬件篇---有线串口通信问题
  • CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器
  • 【linux】Haproxy七层代理
  • MyBatis高级应用实战指南
  • vue使用xlsx库导出excel
  • 深入解析HBase如何保证强一致性:WAL日志与MVCC机制