golang中调用C

qq_33204116 · · 9719 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

项目中项目基本是golang,因为以前的一个库不太好用golang重写,所以只能使用cgo来调用,稍微记录一下

看使用文档

重要的事情说多遍都不为过,一定要仔细看文档:
https://github.com/golang/go/wiki/cgo

注意cgo的注释和 import “C”之间不能有空行!!!

Note that there must be no blank lines in between the cgo comment and the import statement.

package main

/*
#include <stdio.h>
int test() {
    return 2016;
}
*/

import "C"

import "fmt"

func main() {
    fmt.Println(C.test())
}

编译的时候出错:

could not determine kind of name for C.test

看起来莫名其妙的错误,是这个原因导致的。

Go string 和C string转换

Go string -> C string

func C.CString(goString string) *C.char

转换为C string会分配一个内存,因此需要释放,文档中示例如下

// #include <stdlib.h>
import "C"
import "unsafe"
...
    var cmsg *C.char = C.CString("hi")
    defer C.free(unsafe.Pointer(cmsg))
    // do something with the C string

C string -> Go string

func C.GoString(cString *C.char) string
func C.GoStringN(cString *C.char, length C.int) string

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

其他备注

  1. 还没来得及深入cgo文档,具体调用机制没看
  2. cgo性能暂时还没来得及测试

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:qq_33204116

查看原文:golang中调用C

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

9719 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传