golang中调用C

golang 专栏收录该内容
10 篇文章 0 订阅

项目中项目基本是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性能暂时还没来得及测试
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

白日梦想

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值