golang之调用C语言代码

简介: 此篇教程只是简单的描述怎么使用以及遇到的一些错误 我写的实例,C语言与golang在同一个文件中,并没有分开。 我这里演示两个例子:⑴ 调用C语言函数打印“Hello World” 1 #include <stdio.

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

我写的实例,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 - 1) printf("%d",arr[i]);
 8        else printf("%d ",arr[i]);
 9    }
10    printf("]\n");
11  }
12  int* CreateArray(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, 0, 100)
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 - 1) printf("%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 index, int 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里面直接使用下标进行修改。

原文发布时间为:2018-12-16
本文作者:Golang语言社区
本文来自云栖社区合作伙伴“ Golang语言社区”,了解相关信息可以关注“Golangweb”微信公众号

相关文章
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
55 4
|
23天前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
58 15
在 golang 中执行 javascript 代码的方案详解
|
24天前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
25天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
1月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
57 1
|
2月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
2月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
62 4