[Go实战]CGO 入门系列-手把手教程3 调用 mysql (c语言类库)为案例

77 篇文章 4 订阅
订阅专栏

1.安装环境

mingw && mingw-utils
mysql:执行users.sql
golang 1.13

2.编译 && 运行

2.1 dll 编译 def

pexports libmysql.dll > libmysql.def

2.2 def && dll 编译 a

dlltool.exe -D libmysql.dll -d libmysql.def -l libmysql.a -k

2.3 编译运行exe

go build -x

3.出错处理:

3.1 In function `cgo_3a86e410a0e3_Cfunc_mysql_close’:

/tmp/go-build/cgo-gcc-prolog:87: undefined reference to `mysql_close@4'

解决方案:

找到libmysql.def文件覆盖
    "mysql_close" >>>> "mysql_close@4"

3.2 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

解决方案:

WINDOWS:
    SET CGO_ENABLED=1
    SET GOOS=windows
    SET GOARCH=386
    
GOLAND-Environment:
    CGO_ENABLED=1;GOOS=windows;GOARCH=386

4.代码 && github

4.1 核心代码

package main

/*
// -Wl,--allow-multiple-definition for multiple definition
#cgo CFLAGS: -I${SRCDIR}/include
#cgo LDFLAGS: -Wl,--allow-multiple-definition -L${SRCDIR}/lib -lmysql
#include <Windows.h>
#include <winsock.h> // for mysql-socket
#include <stdio.h> // for c.puts
#include <string.h> // for c.strlen
#include "mysql.h"
// 自定义方法
char * GoNil = NULL;
size_t GetMYSQLROWStrLen(MYSQL_ROW row,int j){
	return strlen(row[j]);
}
MYSQL_FIELD GetMYSQLFIELDItem(MYSQL_FIELD * field,int j){
	return field[j];
}
*/
import "C"
import (
	"fmt"
	"log"
	"unsafe"
)

const (
	maxSize = 1 << 20
)

func Pause() {
	var str string
	fmt.Println("")
	fmt.Print("请按任意键继续...")
	fmt.Scanln(&str)
	fmt.Print("程序退出...")
}

func main() {
	C.puts(C.CString(" C MYSQL 使用库函数查询…… "))
	// 使用C的函数库 初始化 MYSQL *
	mysql := C.mysql_init(nil)
	if mysql == nil {
		log.Fatal("mysql is nil")
		return
	}
	// 使用库连接 MYSQL *
	C.mysql_real_connect(mysql, C.CString("127.0.0.1"), C.CString("root"), C.CString("root"), C.CString("dongbao"), C.uint(3306), C.GoNil, C.ulong(0))
	// 查询函数 int
	C.mysql_query(mysql, C.CString("select * from users"))
	// 查询结果  MYSQL_RES *
	results := C.mysql_store_result(mysql)
	// 查询的字段数目  unsigned int
	// 查询结果 char **MYSQL_ROW
	if results == nil {
		log.Fatal("result is nil")
		return
	}
	// 查询结果数目
	num_rows := int(C.mysql_num_rows(results))
	if num_rows > 0 {
		field := C.mysql_fetch_field(results)
		cfields := (*[maxSize]C.MYSQL_FIELD)(unsafe.Pointer(field))
		num_fields := int(C.mysql_num_fields(results))

		fmt.Println("num_rows:", num_rows, "num_fields:", num_fields)

		for i := 0; i < num_rows; i++ {
			var row C.MYSQL_ROW = C.mysql_fetch_row(results)
			rowPtr := (*[maxSize]*[maxSize]byte)(unsafe.Pointer(row))

			for j := 0; j < num_fields; j++ {
				fieldName_StrLen := C.strlen(cfields[j].name)
				field_name := C.GoBytes(unsafe.Pointer(C.GetMYSQLFIELDItem(field, C.int(j)).name), C.int(fieldName_StrLen))

				fieldValue_StrLen := C.GetMYSQLROWStrLen(row, C.int(j))
				field_value := C.GoBytes(unsafe.Pointer(rowPtr[j]), C.int(fieldValue_StrLen))
				if string(field_value) != "" {
					fmt.Printf("[%d]field_name is : %s , field_value is : %s \n",j, string(field_name), string(field_value))
				}
			}
		}
	}

	// 释放结果
	C.mysql_free_result(results)
	// 关闭mysql
	C.mysql_close(mysql)
	C.mysql_server_end()

	Pause()
}

4.2 github:

cgo_mysql_for_windows

5.相关资料

cgo-mysql-for-mac

6.运行结果:

mysql原始数据
在这里插入图片描述

golang查询数据
在这里插入图片描述

Go语言之CGO
太阳上的雨天
08-02 553
Go语言之CGO
go调用c语言结构体,golangcgo---类型转换小试牛刀之C结构体和go结构体转换
weixin_29378273的博客
05-21 850
package main/*#include #include #include #include #define MAX_FACES_PER_DETECT 64typedef struct Point{float x;float y;}Point;typedef struct Rectangle{Point lt;Point rd;}Rectangle;typedef struct Detec...
go cgo
robert198837的专栏
10-16 683
参考:https://golang.org/cmd/cgo/      cgo 可以在go中调用c语言的函数,实例如下,实例代码见 https://github.com/robertzhai/go/tree/master/go_programming_study/src/cgo 1. cprint.go package main /* #include #include */ i
每期一个小窍门 golangCGO_ENABLED 含义
李昊轩的博客
08-26 317
总结起来,使用CGO_ENABLED=0编译会慢一些是因为编译器需要额外的时间来处理CGO相关的代码,并且无法使用C语言的优化技术,同时还需要处理更多的Go代码。CGO_ENABLED是一个环境变量,用于控制Go编译器是否启用CGOC语言调用Go函数)功能。当CGO_ENABLED=0时,表示禁用CGO功能。
GO语言篇之CGO
https://github.com/zm50
09-11 2724
Go语言可以通过内置的CGO调用C语言接口,从而实现C语言代码的交互,CGO提供了一种将Go代码嵌入到C代码中,或者从Go代码中调用C函数的方法。
快速上手 Go CGO,掌握在 Go 里写 C!
EDDYCJY的博客
04-26 391
大家好,我是煎鱼。最近因为各种奇怪的原因,接触到了 Go 特色之一 CGO。这方面的相关内容也相对少一些,给大家抛砖引玉。图片来源于 marlin毕竟很多跨语言调用,还是会依赖 CGO 这个特性。希望大家在真正要用时有个前置知识垫肚子。CGO 是什么CGO 就是 C 和 Go,两个编程语言。指的是能够创建调用 C 代码的 Go 包。对照着 Go 代码中的 “C”:packagemain imp...
go语言的cgo简单教程
热门推荐
督门提酒的博客
03-08 1万+
目前Go语言有2套编译器:GC和gccgo。其中GC提供的cgo支持C语言,gccgo支持C/C++。 此外,SWIG从2.0.1之后也对go语言提供支持,可以支持C++的类和回调。Go官方提供cmd/go命令, 可以很好的支持cgo,swig支持目前还在完善之中。 本文将简要介绍基于cgo集成C/C++库,适用平台: Linux/Windows。
Golang 中的 cgo 使用方法,调用 mysql (c语言类库)为案例.pdf
12-16
Golang 中的 cgo 使用方法,调用 mysql (c语言类库)为案例
混沌博弈优化算法CGO-TCN-LSTM-Multihead-Attention多变量时间序列预测Matlab实现.rar
最新发布
09-10
1.版本:matlab2014/2019a/2024a ...3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
Jni-Golang:java调用golang(通过Go1.5共享库)
05-05
在 Go 1.5 版本之后,Go 语言引入了 cgo,这是一个工具,它允许 Go 代码调用 C 代码,并且可以生成可链接到其他 C 代码的库。借助 cgo,我们可以创建一个可被 Java 通过 JNI 调用Golang 共享库。 以下是实现步骤...
Go语言使用cgo嵌套C语言函数调用demo.zip
06-13
本文将深入探讨如何在Go语言中使用cgo嵌套C语言函数调用,并通过一个示例来具体阐述这一过程。 首先,我们需要了解cgo的基本使用方法。cgo是Go的标准库`$GOROOT/src/runtime/cgo`的一部分,它提供了Go和C之间互操作...
Go 内存管理之三:CGO
flynetcn的专栏
09-18 1932
之前在 povilasv.me[1] 上,我们一起探讨了 Go 内存管理 和 Go 内存管理之二。在上篇博文中,我们发现使用 cgo 会占用更多的虚拟内存。现在我们来深入研究一下 cgo。 本文是 Go语言中文网组织的 GCTT 翻译,发布在 Go语言中文网公众号,转载请联系我们授权。 CGO 揭秘 正如之前所见,cgo 会使虚拟内存膨胀。此外,对于大部分用户而言,一旦他们导入了 net 包或者其子包(比如 http),就会自动的使用 cgo。 我在标准库的代码里发现很多描述 cgo 调用工作机制的
[Go语言]cgo用法演示
weixin_30319153的博客
03-05 237
经历了数十年发展的C语言,各种各样的现成的库已经非常丰富。通过cgo,可以在Go语言中使用C语言代码,充分利用好现有的“轮子”。 本文所有代码,在下述环境中调试通过: Windows 8.1 64-bit Go 1.3.3 64-bit GCC 4.8.1 64-bit 要想使用cgo,要导入C“包”: import "C" 这...
golang调用c库,cgo(一)
猛犸象
05-09 4179
golang调用c库,cgo(一)
Go:优雅处理项目中的cgo依赖问题(1),2024年最新Golang入门零基础
2401_84252890的博客
04-13 518
在Go项目中处理cgo依赖的问题可以采取多种策略。从条件编译到依赖注入,再到使用Docker容器,每种方法都有其适用场景。选择最适合我们项目和开发流程的方法,可以显著提高开发效率,减少因环境差异引起的编译和运行时错误。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。
【go语言】5.2.1 CGO的基本概念
Andy0214的专栏
08-16 5288
在Go语言中,CGO允许Go程序直接调用C语言代码。这是通过链接Go和C语言的二进制代码来实现的。这样,Go程序可以使用C语言的库,或者在性能关键的地方使用C语言代码。
【go语言】5.2.2 使用CGO调用C库
Andy0214的专栏
08-17 5384
Go可以通过CGO调用C库。这使得Go可以利用大量的C库,进而扩展其功能。接下来,我们将展示如何在Go程序中调用C库。
Go:优雅处理项目中的cgo依赖问题,2024年最新Golang组件化开发教程
2401_84252890的博客
04-13 363
在Go项目中处理cgo依赖的问题可以采取多种策略。从条件编译到依赖注入,再到使用Docker容器,每种方法都有其适用场景。选择最适合我们项目和开发流程的方法,可以显著提高开发效率,减少因环境差异引起的编译和运行时错误。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。
Go语言中的CGOC语言交互详解
发现生活,分享智慧,一起成长!
05-21 1074
CGO为Go语言和C语言之间的交互提供了一个强大的工具。通过使用CGO,我们可以利用现有的C库或C语言编写的代码,以获得更多的功能和灵活性。无论是封装C库、性能优化、跨平台兼容性,还是利用已有的C工具链,CGO都能帮助我们轻松实现目标。通过上面的示例代码,我们可以看到CGOC语言交互的简单性和实用性。希望这篇文章能帮助你更好地理解和使用CGOC语言的交互。推荐阅读我的博客首页Golang专栏。
写文章

热门文章

  • [Redis实战]Redis:WARNING: redis-trib.rb is not longer available 46421
  • [Go实战]go-gorm的预加载 preload或related方法使用场景 21023
  • [Go实战]配置插件推荐goland - File Watchers 20680
  • [Go实战]mac 完全删除 go 17514
  • [Go实战]gin+token(JWT)验证,登陆验证实现1 15840

分类专栏

  • [Golang/CGO] 77篇
  • [Java] 32篇
  • [Unity] 26篇
  • [JavaScript/TypeScript] 11篇
  • [NodeJS] 7篇
  • [Python] 6篇
  • [PHP] 4篇
  • [数据库] 19篇
  • [开源工具/其他] 45篇
  • [技美CG] 4篇

最新评论

  • [Go实战]CGO 入门系列-手把手教程1

    pycharm4516464: 你好,可以加个联系方式教我go如何调用第三方C++库吗,有偿

  • [新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...

    是许诺: 不实用,还是老老实实用线连吧

  • [新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...

    wzhwangzhihui: 还是买根线,电脑直接连到电视上,不然延迟确实头疼。

  • [新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...

    zzzzzzzzzzzzdy: 这个方式我用过,但是电视很卡,网速没问题还是在电视上,不知道怎么解决,海信的vidda

  • [开源工具]git stash clear后如何按时间顺序找回 比git fsck --lost-found好用1W倍

    单雨姗: 亲测有效!感谢🙏 比一个个找要方便多了

大家在看

  • 一文掌握Kubernetes的Empty存储类型实践 796
  • 【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性
  • 智能农业气象站
  • python画图|图例设置基础教程 752
  • Java避坑案例 - 接口设计_版本控制策略 449

最新文章

  • [新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...
  • [开源工具]git stash clear后如何按时间顺序找回 比git fsck --lost-found好用1W倍
  • [Unity实战]EnhancedScroller v2.21.4简单使用[开箱可用]
2024年1篇
2023年21篇
2022年37篇
2021年41篇
2020年12篇
2019年75篇
2018年41篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场美陈浪漫的热气球橱窗武汉水果玻璃钢雕塑多少钱甘南城市玻璃钢雕塑安装桂林玻璃钢人物雕塑气球商场美陈装饰联系方式玻璃钢雕塑哪家强高淳商场大型美陈玻璃钢幼儿园景观雕塑重庆玻璃钢雕塑翻模招聘广西玻璃钢花盆制作玻璃钢雕塑上色的方法有哪些玻璃钢花盆玻璃纤维青浦区专业玻璃钢雕塑免费咨询肇庆人物玻璃钢雕塑山东景观玻璃钢雕塑定制上海卡通玻璃钢雕塑制作叙永玻璃钢花盆花器福清玻璃钢艺术雕塑汤阴玻璃钢雕塑厂家平安玻璃钢雕塑制品厂新密镂空玻璃钢仿铜雕塑厂家山东中庭商场美陈销售企业动物玻璃钢卡通雕塑源头好货玻璃钢熊大雕塑珠海玻璃钢雕塑定制玻璃钢花盆工程公司北京通道商场美陈制造动物玻璃钢雕塑加工厂宿迁玻璃钢仿铜雕塑定做四川玻璃钢雕塑批发香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化