golang之调用C语言代码

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang之调用C语言代码相关的知识,希望对你有一定的参考价值。

此篇教程只是简单的描述怎么使用以及遇到的一些错误

我写的实例,C语言与golang在同一个文件中,并没有分开。

我这里演示两个例子:
⑴ 调用C语言函数打印“Hello World”


1  #include <stdio.h>
2  void PrintHello(){
3    printf("Hello World!\n");
4  }


c代码写好了我们就写golang代码


1   import "C"
2  func main() {
3      C.PrintHello()
4  }


输出结果是:Hello World!

完整代码


 1 package main
2  /*
3  #include <stdio.h>
4  void PrintHello(){
5      printf("Hello World!\n");
6  }
7  */

8  import "C"
9  func main() {
10      C.PrintHello()
11  }


请将我这段代码,原样复制进行测试,你看到结果就明白了怎么调用C函数了,其中要特别说明的就是:
① C代码与import "C"之间不能有空格
② import "C"这里的"C"要独自占一个import,也可以这样写
import (
"C"
)
但是不能这样
import (
"C"
"fmt"
)
③ C代码是被注释的状态;
⑵ 打印给定数组


 1#include <stdio.h>
2  #include <stdlib.h>
3  void PrintArray(int arr[], int len){
4    int i = 0;
5    printf("[");
6      for (i = 0; i < len; i++){
7        if (i == len - 1printf("%d",arr[i]);
8        else printf("%d ",arr[i]);
9    }
10    printf("]\n");
11  }
12  intCreateArray(int len){
13    int* arr = (int*)malloc(sizeof(int)*len);
14    int i = 0;
15    for (i = 0; i < len; i ++) {
16        arr[i] = i;
17    }
18    return arr;
19  }
20  void SetArrValue(int *arr, int index, int value){
21    arr[index] = value;
22  }


然后是golang代码


1  import "C"
2  func main() {
3    var b *C.int = C.CreateArray(5)
4    C.SetArrValue(b, 0100)
5    C.PrintArray(b, 5)
6  }


输出的结果是:[100 1 2 3 4]
全部代码,复制测试,尽量全部复制,然后再修改代码进行测试


 1/*
2  #include <stdio.h>
3  #include <stdlib.h>
4  void PrintArray(int arr[], int len){
5    int i = 0;
6    printf("[");
7      for (i = 0; i < len; i++){
8        if (i == len - 1printf("%d",arr[i]);
9        else printf("%d ",arr[i]);
10    }
11    printf("]\n");
12  }
13  int* CreateArray(int len){
14    int* arr = (int*)malloc(sizeof(int)*len);
15    int i = 0;
16    for (i = 0; i < len; i ++) {
17        arr[i] = i;
18    }
19    return arr;
20  }
21  void SetArrValue(int *arr, int indexint value){
22    arr[index] = value;
23  }
24  */
25  import "C"
26  func main() {
27    var b *C.int = C.CreateArray(5)
28    C.SetArrValue(b, 0, 100)
29    C.PrintArray(b, 5)
30  }
31


特别说明
按到底打印不需要这么多函数,但是遇到好几个问题,首先我使用C语言的方式进行传参:C.PrintArray([1,2,3,4,5], 5),毫无疑问这是会失败的;第二种方式是使用golang的方式进行,先声明数组,然后再进行传参


1var b = []C.int{1,2,3,4,5}
2  C.PrintArray(b,5)


然后就会报下面的错误:
cannot use b (type []_Ctype_int) as type *_Ctype_int in argument to _Cfunc_PrintArray
根据错误,我们可以看出是类型不统一,说不能使用类型[]_Ctype_int作为函数的参数类型*_Ctype_int;我一看这是需要指针,然后我就进行第三次尝试;

声明一个C语言指针,然后开辟空间,然后再逐一赋值:
var b *C.int = C.malloc(C.sizeof(int)*5)
这一次提示的是
could not determine kind of name for C.sizeof
这句话的大概意思就是不能确定类型C.sizeof,我是这样理解,反正就是不能用,于是我就想到了使用上面那一种方式进行;后面想到需要修改里面的值,于是又写了一个函数,专门修改数组的值,因为我发现并不能在golang里面直接使用下标进行修改。



版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。



Golang语言社区

ID:Golangweb

www.bytedancing.com

游戏服务器架构丨分布式技术丨大数据丨游戏算法学习


以上是关于golang之调用C语言代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在golang 中调用c的静态库或者动态库

golang cgo 使用总结

Java基础之方法的调用重载以及简单的递归

golang goroutine例子[golang并发代码片段]

golang代码片段(摘抄)

C语言代码片段