Jquery中文网 www.jquerycn.cn
Jquery中文网 >  数据库  >  mysql  >  正文 Golang中的cgo调用 mysql 库的例子

Golang中的cgo调用 mysql 库的例子

发布时间:2017-12-10   编辑:www.jquerycn.cn
jquery中文网为您提供Golang中的cgo调用 mysql 库的例子等资源,欢迎您收藏本站,我们将为您提供最新的Golang中的cgo调用 mysql 库的例子资源
Golang中的cgo调用 mysql 库用到的不多但是非常的有用了,下面我们一起来看一篇关于Golang中的cgo调用 mysql 库的例子,具体如下所示。

Golang 中关于 cgo 的文档比较少,所以我绝对写个简单的案例,这里用 Mysql 做案例,一种是调用C里边的函数,一种是完全用 golang 来点用 mysql 库函数。我的环境是 MAC ,如果测试的话,请 LDFLAGS 对应自己的环境编写。

注意的地方

Golang 的 cgo 引用必须单独一行,也就是说必须如下写法

import "C"
cgo 中 没有 C.NULL 类型 ,所以你要使用 nil

package main

/*

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "/usr/local/mysql/include/mysql.h"

MYSQL *mysql,*res;
MYSQL_RES *results;
MYSQL_FIELD *field;

    struct Person {
        char *name;
        int age;
        int height;
        int weight;
    };
#cgo darwin LDFLAGS: -I/usr/local/mysql/include -L/usr/local/mysql/lib  -lmysqlclient

void get_mysql_query()
{
   MYSQL_ROW row;
   mysql = mysql_init(NULL);
   mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");

   res = mysql_real_connect(mysql, "127.0.0.1","root","dgj99349", "myblog", 0,NULL,0);

   if ( mysql_query(res, "SELECT * FROM wp_users")){
        fprintf(stderr,"Query failed (%s)/n",mysql_error(res));
        exit(1);
   }

   if (!(results=mysql_store_result(res))) {
        fprintf(stderr,"Couldn't get result from %s/n", mysql_error(res));
        exit(1);
    }
  
   int number = mysql_num_fields(results);
   while( ( row = mysql_fetch_row(results) ) ) {
      for ( int i = 0; i < number; i )
      {
         if( (field = mysql_fetch_field(results) )!=NULL ){
            printf("field_name is : %s , field_value is : %s \n", field->name,row[i]);
         }
      }
   }
  
   mysql_free_result(results);
   mysql_close(mysql);
   mysql_server_end();

   return;
}
*/
import "C"
import "fmt"
import "unsafe"

const (
    maxSize = 1 << 20
)

func main() {
 
  
    C.puts(C.CString(" C MYSQL 函数查询…… "))
    C.get_mysql_query()

    C.puts(C.CString(" C MYSQL 使用库函数查询…… "))
    // 使用C的函数库 初始化 MYSQL *
    mysql := C.mysql_init(nil);
    // 使用库连接 MYSQL *
    C.mysql_real_connect(mysql, C.CString("127.0.0.1"),C.CString("root"),C.CString("dgj99349"), C.CString("myblog"), 0,nil,0);
    // 查询函数 int
    C.mysql_query(mysql,C.CString("SELECT * FROM wp_users"))
    // 查询结果  MYSQL_RES *
    results := C.mysql_store_result(mysql)
    // 查询的字段数目  unsigned int
    number := C.mysql_num_fields(results);
    // 查询结果 char **MYSQL_ROW
    row := C.mysql_fetch_row(results)
    // 查询的字段结果  MYSQL_FIELD *
    field := C.mysql_fetch_field(results)
    // 每个字段的内容的长度 unsigned long
    sql_lengths := C.mysql_fetch_lengths(results)

    lengths := (*[maxSize]uint64)(unsafe.Pointer(sql_lengths))
   
    cfields := (*[maxSize]C.MYSQL_FIELD)(unsafe.Pointer(field))
   
    rowPtr := (*[maxSize]*[maxSize]byte)(unsafe.Pointer(row))
   
    for i := 0; i < int(number); i {
        length := cfields[i].name_length
        fname := (*[maxSize]byte)(unsafe.Pointer(cfields[i].name))[:length]
        fmt.Print("field_name is :",string(fname))
        fmt.Println(" ,field_value is : ",string(rowPtr[i][:lengths[i]]))
    }
    // 释放结果
    C.mysql_free_result(results);
    // 关闭mysql
    C.mysql_close(mysql);
    C.mysql_server_end();
  
}

您可能感兴趣的文章:
Golang中的cgo调用 mysql 库的例子
cgo快速入门之golang调用C语言
C/C /Go混合编程实践之GoJieba
mysql实例 使用if语句检测数据库版本
[ golang ] golang 语言特性
mysql functions实例:检查mysql版本
分享:linux下mysql连接命令
Go 语言的核心优势
mysql实例 repeat语句的用法
mysql的call用法 嵌套函数调用的例子

[关闭]