• 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


  • 相关阅读:
    利用FlashPaper实现类似百度文库功能
    浅谈Oracle函数返回Table集合
    Oracle 触发器在日志管理开发中的应用
    Putty 工具 保存配置的 小技巧
    java.util.Date转java.sql.Date丢失时间问题
    java String和Date转换
    springboot项目使用拦截器修改/添加前端传输到后台header和cookie参数
    Spring的使用及Spring3.2控制器增强@ControllerAdvice
    使用fastjson统一序列化响应格式
    【转】Elastic-Job
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4926796.html
Copyright © 2020-2023  润新知