返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言中CGO的使用实践
  • 764
分享到

Go语言中CGO的使用实践

2024-04-02 19:04:59 764人浏览 安东尼
摘要

目录1. Go语言调用C函数例子:2. Go语言调用C库函数:3. Go语言导出函数给C语言使用:4. Go语言导出函数指针给c语言使用:   &nbs

       部门产品业务功能采用golang开发,但是有些功能是用c写的,比如说net-snmp,bfd协议等等,像这些如果使用GO语言重编的话,既有实现的复杂度也需要相当长的时间,好在GO语言提供了CGO机制,使得能够在go代码中直接调用C的库函数,大大提高了效率,减少了重复开发工作,此外还支持在C语言中调用GO函数,这一点还是蛮强大的。

1. Go语言调用C函数例子:


package main
 
//
// 引用的C头文件需要在注释中声明,紧接着注释需要有import "C",且这一行和注释之间不能有空格
//
 

import "C"
 
 
import (
	"fmt"
	"unsafe"
)
 
func main() {
	//使用C.CString创建的字符串需要手动释放。
	cs := C.CString("Hello World\n")
	C.myprint(cs)
	C.free(unsafe.Pointer(cs))
	fmt.Println("call C.sleep for 3s")
	C.sleep(3)
	return
}

运行:

2. Go语言调用C库函数:

hello.c


#include <stdio.h>
void hello()
{
    printf("hello world\n"); 
}

hello.h


#ifndef HELLO_H
#define HELLO_H
 
void hello(void);
#endif

编译:


GCc -c hello.c
ar -cru libhello.a hello.o

package main
 
//使用#cgo定义库路径
 
 

import "C"
 
func main() {
	C.hello()
}

运行:

3. Go语言导出函数给C语言使用:

main.go


package main
 
//
//#include <stdio.h>
//int add(int a, int b);
//
import "C"
 
import (
	"fmt"
)
 
//当使用export的时候,在同一个文件中就不能再定义其它的c函数了,不然会报错。
//使用export导出函数给c语言调用。
 
//export GoAdd
func GoAdd(a, b int) int {
	return a + b
}
 
func main() {
	a := C.add(1, 2)
	fmt.Printf("C.add(1,2) return %d\n", a)
}

cfunc.go


package main
 
//
//int GoAdd(int a, int b); 
//
//int add(int a, int b)
//{
//	  return GoAdd(a,b);
//}
//
import "C"

运行:

4. Go语言导出函数指针给c语言使用:

还有一种使用方式,这种是我使用比较多的。就是传递函数指针,因为GO函数无法取址,因此需要写个中间函数做个转换操作,例子如下:

clibrary.c


#include <stdio.h>
 
#include "clibrary.h"
 
//参数是函数指针
void some_c_func(callback_fcn callback)
{
	int arg = 2;
	printf("C.some_c_func(): calling callback with arg = %d\n", arg);
	int response = callback(2);
	printf("C.some_c_func(): callback responded with %d\n", response);
}

 clibrary.h


#ifndef CLIBRARY_H
#define CLIBRARY_H
//定义函数指针
typedef int (*callback_fcn)(int);
void some_c_func(callback_fcn);
#endif

Go code:


package main
 

import "C"
 
import (
	"fmt"
	"unsafe"
)
 
//export callOnMeGo
func callOnMeGo(in int) int {
	return in + 1
}
 
func main() {
	fmt.Printf("Go.main(): calling C function with callback to us\n")
 
    //使用unsafe.Pointer转换
	C.some_c_func((C.callback_fcn)(unsafe.Pointer(C.callOnMeGo_cgo)))
}

中间函数:


package main
 

import "C"

运行:

开发注意事项:

1. 在注释和import”C”之间不能有空行

2. 使用C.CString函数转换GoString为CString时要手动释放该字符串。

3. CGO不支持使用变参的函数,例如printf,如果要使用的话,可以写个包裹函数m'yprintf,使用传参的方式调用。

4. Go支持使用//export导出函数给C使用,但是有一点需要注意就是不能在export导出的同一个文件里定义c函数,不然会出现

multiple definition of "xxx"编译错误,如果函数非常tiny的话,还有一个方法是使用static inline 来声明该函数,如下:


package gocallback
 
import (
	"fmt"
	"sync"
)
 

import "C"
 

参考资料:

1. https://GitHub.com/golang/go/wiki/cgo

到此这篇关于Go语言中CGO的使用实践的文章就介绍到这了,更多相关Go语言使用CGO内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言中CGO的使用实践

本文链接: https://lsjlt.com/news/136467.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言中CGO的使用实践
    目录1. Go语言调用C函数例子:2. Go语言调用C库函数:3. Go语言导出函数给C语言使用:4. Go语言导出函数指针给c语言使用:   &nbs...
    99+
    2024-04-02
  • Go语言怎么实现CGO编程
    本文小编为大家详细介绍“Go语言怎么实现CGO编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言怎么实现CGO编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。基于 C 标准库实现最简单的 CGO 程序...
    99+
    2023-07-05
  • 探讨Go语言中SQL应用的实践经验
    亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《探讨Go语言中SQL应用的实践经验》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。Go语言...
    99+
    2024-04-04
  • Go 语言在运维中的最佳实践
    go语言运维最佳实践并发模式: goroutine和管道提高性能。结构化日志: 使用日志包记录结构化信息,便于调试和分析。错误处理: 使用错误代码或类型,检查错误值确保成功。性能优化: ...
    99+
    2024-04-08
    运维 go语言 docker
  • 实践指南:如何在Go语言中高效使用goroutine?
    在Go语言中使用goroutine是一种非常高效的并发编程方式,它可以让程序实现并行执行,从而提高程序的性能。但是,要想在Go语言中高效使用goroutine,不仅需要了解gorout...
    99+
    2024-03-12
    实践 高效性 go语言
  • Linux文件存储:使用Go语言的最佳实践
    在现代软件开发过程中,存储和管理文件是一个非常重要的部分。Linux是一个非常流行的操作系统,它提供了很多强大的文件系统和工具,可以让我们更好地管理和存储文件。同时,Go语言是一种非常流行的编程语言,它也提供了很多的文件存储和管理的工具。...
    99+
    2023-08-05
    linux 文件 存储
  • 使用Go语言拼接字符串的最佳实践
    使用Go语言拼接字符串的最佳实践 在Go语言中,字符串的拼接是一项常见的操作。在进行字符串拼接时,我们需要考虑到性能和内存的消耗。本文将介绍一些在Go语言中进行字符串拼接的最佳实践,并...
    99+
    2024-03-13
    go语言 最佳实践 拼接字符串
  • Go语言项目开发实践中的最佳实践分享
    Go语言近年来在软件开发领域越来越受到关注,成为了很多开发者的首选语言。其简洁的语法、高效的并发模型,以及强大的标准库,使得Go语言在开发项目时具有很大的优势。然而,在实际项目开发中,还是存在一些需要注意的地方,本文将分享一些Go语言项目开...
    99+
    2023-11-03
    合理利用并发编程能力 合理处理错误
  • GO语言中使用容器技术的最佳实践是什么?
    随着云计算技术的不断发展,容器化技术已经成为了云计算领域中非常热门的一个话题。而GO语言作为一门非常流行的编程语言,在容器技术方面也有很多的应用实践,本文将会介绍一些使用GO语言实现容器化技术的最佳实践。 一、使用Docker Docke...
    99+
    2023-11-03
    容器 spring shell
  • go语言实现mqtt协议的实践
    目录一、什么是MQTT二、Go语言MQTT服务器Broker的搭建三、Go客户端访问简单API一、什么是MQTT MQTT(Message Queuing Telemetry Tra...
    99+
    2024-04-02
  • 浅谈go中cgo的几种使用方式
    目录最简单的CGO程序源码方式调用C函数内部机制编译和链接参数编译参数:CFLAGS/CPPFLAGS/CXXFLAGS链接参数:LDFLAGS通过静态库的方式调用C函数通过动态库的...
    99+
    2024-04-02
  • Go语言在网络编程中的实践与运用
    Go语言作为一种现代化的编程语言,在网络编程领域具有许多独特的优势。它的简洁、高效以及并发特性使得它成为许多工程师首选的语言之一。在本文中,我们将探讨Go语言在网络编程领域的实践与应用...
    99+
    2024-02-25
    go语言 网络编程 实践应用 并发请求 标准库
  • 从实践角度探讨Go语言中的SQL应用
    Go语言作为一种快速、高效的编程语言在近年来受到了越来越多开发者的青睐,尤其在后端开发领域有着广泛的应用。在实际应用中,数据库的操作是不可避免的一部分,而SQL作为关系型数据库的标准查...
    99+
    2024-04-02
  • Go语言在APP开发中的技术实践
    在APP开发领域中,Go语言作为一种快速、高效的编程语言,越来越受到开发者的青睐。其简洁的语法、高效的并发机制以及丰富的标准库,使得Go语言在移动应用开发中具有独特的优势。本文将从技术...
    99+
    2024-04-02
  • Go语言中的并发性能优化实践
    优化 go 语言并发性能的实践包括:建立 goroutine 池以避免 goroutine 创建/销毁开销。优化通道使用,避免阻塞操作,以提高响应能力。使用读写锁来减少锁争用,提高共享资...
    99+
    2024-05-07
    go语言 并发性能优化 优化实践 并发访问
  • 使用Go语言开发嵌入式应用的最佳实践
    在当今嵌入式系统开发中,Go语言正逐渐成为一种备受青睐的选择。作为一种强大、高效且易于使用的编程语言,Go在嵌入式领域展现出许多优势。本文将探讨如何使用Go语言开发嵌入式应用的最佳实践...
    99+
    2024-03-15
    go语言 最佳实践 嵌入式应用 标准库
  • 实践和应用:Go语言的并发控制
    编程网今天将给大家带来《实践和应用:Go语言的并发控制》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议...
    99+
    2024-04-04
  • Go语言中的Django对象数据类型应用实践
    Go语言是一门开源的编程语言,它的出现旨在解决C++和Java的一些问题,如编译时间长、代码臃肿等。而Django是Python语言中流行的Web框架,提供了方便的ORM(对象关系映射)功能,可以帮助开发人员更加高效地管理数据库。本文将介绍...
    99+
    2023-08-21
    django 对象 数据类型
  • Go语言中的函数式编程容器实践
    随着Go语言的日渐流行,越来越多的程序员开始使用Go语言进行开发。与此同时,越来越多的人也开始关注。本文将介绍,并且会提供一些演示代码。 什么是函数式编程? 在讨论之前,我们需要先了解一下什么是函数式编程。函数式编程是一种编程范式,它将计...
    99+
    2023-09-29
    接口 容器 函数
  • Go 语言中处理 EOF 错误的最佳实践
    处理 eof 错误时应遵循最佳实践:使用 io.eof 常量显式检查;2. 使用 errors.is 函数进行类型检查;3. 对 *os.file 类型进行类型断言以获取更多信息。通过这...
    99+
    2024-04-08
    go语言 eof
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作