我是靠谱客的博主 帅气电源,最近开发中收集的这篇文章主要介绍[Go实战]CGO 入门系列-手把手教程3 调用 mysql (c语言类库)为案例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

cgo-mysql-for-windows

    • 1.安装环境
    • 2.编译 && 运行
    • 2.1 dll 编译 def
    • 2.2 def && dll 编译 a
    • 2.3 编译运行exe
    • 3.出错处理:
      • 3.1 In function `cgo_3a86e410a0e3_Cfunc_mysql_close':
      • 3.2 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
    • 4.代码 && github
      • 4.1 核心代码
    • 4.2 github:
    • 5.相关资料
    • 6.运行结果:

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 入门系列-手把手教程3 调用 mysql (c语言类库)为案例的全部内容,希望文章能够帮你解决[Go实战]CGO 入门系列-手把手教程3 调用 mysql (c语言类库)为案例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部