zoukankan      html  css  js  c++  java
  • Go调用C代码,Cgo札记

    http://www.myexception.cn/program/679738.html


    Go调用C代码,Cgo笔记

    参考:

    官方文档:

    http://golang.org/cmd/cgo/

    http://blog.golang.org/2011/03/c-go-cgo.html

     

    一份博文,编译过程讲得比较细:

    http://googollee.blog.163.com/blog/static/1159411201031812128593/

     

    Go语言教程:使用C语言函数:

    http://chaishushan.blog.163.com/blog/static/130192897201012710273283/

     

     

    看完上面的教程,基本上知道怎么用Go调用C代码、和需要注意的事项。

    至于C调用Go的代码,Go调用汇编代码,以后再研究吧。

     

    以下内容是笔记,列出一些重点等,不解释。

     

    源文件

     

    /*
    // 这是注释中的注释
    #include <stdio.h>
    #include <errno.h>
    */
    import "C"
     
    // #cgo CFLAGS: -DPNG_DEBUG=1
    // #cgo linux CFLAGS: -DLINUX=1
    // #cgo LDFLAGS: -lpng
    // #include <png.h>
    import "C"
     
    // #cgo pkg-config: png cairo
    // #include <png.h>
    import "C"
     

     

    编译方法

     

     

    include $(GOROOT)/src/Make.inc
    
    TARG=xdb
    CGOFILES=xdb.go
    
    CGO_CFLAGS+=-L/opt/xunsearch/lib/ -I/opt/xunsearch/include
    CGO_LDFLAGS+=-lscws -L/opt/xunsearch/lib/
    
    include $(GOROOT)/src/Make.pkg
     
    说明:CFlags等参数,可以写在Go的源代码中
     

     

    数据类型转换

    C -> Go

     

     

    int(C.int )
    
    // C string to Go string
    func C.GoString(*C.char) string
    
    // C string, length to Go string
    func C.GoStringN(*C.char, C.int) string
    
    // C pointer, length to Go []byte
    func C.GoBytes(unsafe.Pointer, C.int) []byte
    
     

     

     

    Go -> C

     

     

    C.char
    C.schar (signed char)
    C.uchar (unsigned char)
    C.short
    C.ushort (unsigned short)
    C.int
    C.uint (unsigned int)
    C.long
    C.ulong (unsigned long)
    C.longlong (long long)
    C.ulonglong (unsigned long long)
    C.float
    C.double. 
    
    
    unsafe.Pointer (void*)
    
    // Go string to C string
    func C.CString(string) *C.char
    
    var val []byte
    (*C.char)(unsafe.Pointer(&val[0]))
    
     

     

     

    内存释放

     

    cs := C.CString(s)
    defer C.free(unsafe.Pointer(cs))
    Go创建的对象,可以很好的回收;而C创建的,则需要手动回收

     

    注意事项:

      不支持调用像 Printf()

     

      不清楚的地方,问人,或者看别人用Go调用C的代码。

     

     

    (待完善)

    http://googollee.blog.163.com/blog/static/1159411201031812128593/

    http://my.oschina.net/zengsai/blog/5138

    http://my.oschina.net/zengsai/blog/5139


  • 相关阅读:
    Linux DNS配置
    SqlCommandBuilder 为SqlDataAdapter 提供 update、insert、delete 命令(自己利用select命令自动从数据库元数据推断)
    Dev中GridView——事件
    select 动态赋值 layui重新渲染
    url-loader和file-loader的区别和使用
    Fetch API
    Fetch API
    FormData上传文件
    Buffer、ArrayBuffer互转
    if exists用法(判断对象的用法)
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4926796.html
Copyright © 2011-2022 走看看