CGO Types

C作为一种混合编程语言已经很久了,无论那些广泛使用的包是用何种语言实现的,都导出了和C兼容的API。Go程序调用C程序,可以借助两种工具实现,一种是cgo,另一种是SWIG工具。Cgo是为C函数创建go绑定的工具;SWIG工具可以提供更复杂的特性来调用C++程序。(关于SWIG工具的使用,可以参考以前的《calling c++ from golang with swig 》系列随笔)。

本文主要讲述C语言类型、在CGO中可以引用的C类型及对应的引用类型名称。

查询C99标准文档(6.2.5 Types),主要类型包括:_Bool、char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned long、long long、unsigned long long、float、double、long double、float _Complex、double _Complex、long double _Complex、void *、__int128_t、__uint128_t

在CGO中引用C类型的名称可以参考CGO官方文档(Command cgo)。Go references to C 部分给出了可以引用的数值类型名称。

综合两份参考文献,给出下面的类型列表。

C Types

Cgo  Types

_Bool

C._Bool

char

C.char

signed char

C.schar

unsigned char

C.uchar

short

C.short

unsigned short

C.ushort

int

C.int

unsigned int

C.uint

long

C.long

unsigned long

C.ulong

long long

C.longlong

unsigned long long

C.ulonglong

float

C.float

double

C.double

long double

不支持(unexpected: 16-byte float type - long double)

float _Complex

C.complexfloat

double _Complex

C.complexdouble

long double _Complex

不支持( unexpected: 32-byte complex type - complex long double)

void*

unsafe.Pointer

__int128_t

[16]byte

__uint128_t

[16]byte

C语言中的数值类型long double和long double _Complex在CGO中不能引用,编译报错。

写一个简单的程序来演示下:

  1. package main
  2.  
  3. /*
  4. #include <limits.h>
  5. #include <float.h>
  6.  
  7. _Bool b = 1;
  8. char c = 'A';
  9. signed char sc = CHAR_MIN;
  10. unsigned char usc = UCHAR_MAX;
  11. short s = SHRT_MIN;
  12. unsigned short us = USHRT_MAX;
  13.  
  14. int i = INT_MIN;
  15. unsigned int ui = UINT_MAX;
  16.  
  17. long l = LONG_MIN;
  18. unsigned long ul = ULONG_MAX;
  19.  
  20. long long ll = LONG_LONG_MIN;
  21. unsigned long long ull = ULONG_LONG_MAX;
  22.  
  23. float f = FLT_MIN;
  24. double d = DBL_MIN;
  25. long double ld = LDBL_MIN;
  26.  
  27. float _Complex fc = 5+5i;
  28. double _Complex dc = 5+5i;
  29. long double _Complex ldc = 5+5i;
  30.  
  31. __int128_t i128 = 0;
  32. __uint128_t ui128 = 3.4028236692093846346337460743177e+38;
  33.  
  34. void *ptr = 0;
  35.  
  36. */
  37. import "C"
  38. import "fmt"
  39. import "unsafe"
  40.  
  41. func main() {
  42.     fmt.Println(C.b)
  43.  
  44.     fmt.Println(C.c)
  45.     fmt.Println(C.sc)
  46.     fmt.Println(C.usc)
  47.  
  48.     fmt.Println(C.s)
  49.     fmt.Println(C.us)
  50.  
  51.     fmt.Println(C.i)
  52.     fmt.Println(C.ui)
  53.  
  54.     fmt.Println(C.l)
  55.     fmt.Println(C.ul)
  56.  
  57.     fmt.Println(C.ll)
  58.     fmt.Println(C.ull)
  59.  
  60.     fmt.Println(C.f)
  61.     fmt.Println(C.d)
  62.     //fmt.Println(C.ld)
  63.  
  64.     fmt.Println(C.fc)
  65.     fmt.Println(C.dc)
  66.     //fmt.Println(C.ldc)
  67.  
  68.     fmt.Println(C.i128)
  69.     fmt.Println(C.ui128)
  70.  
  71.     fmt.Println(C.ptr)
  72.  
  73.     fmt.Println("-------------------------------------------------")
  74.     fmt.Println(C._Bool(true))
  75.  
  76.     fmt.Println(C.char('A'))
  77.     fmt.Println(C.schar(-128))
  78.     fmt.Println(C.uchar(255))
  79.  
  80.     fmt.Println(C.short(C.SHRT_MIN))
  81.     fmt.Println(C.ushort(C.USHRT_MAX))
  82.  
  83.     fmt.Println(C.int(C.INT_MIN))
  84.     fmt.Println(C.uint(C.UINT_MAX))
  85.  
  86.     fmt.Println(C.long(C.LONG_MIN))
  87.     fmt.Println(C.ulong(C.ULONG_MAX))
  88.  
  89.     fmt.Println(C.longlong(C.LONG_LONG_MIN))
  90.     fmt.Println(C.ulonglong(18446744073709551615))
  91.  
  92.     fmt.Println(C.float(-1))
  93.     fmt.Println(C.double(-1))
  94.     //fmt.Println(C.longdouble(1))
  95.  
  96.     fmt.Println(C.complexfloat(5 + 5i))
  97.     fmt.Println(C.complexdouble(5 + 5i))
  98.  
  99.     C.i128 = [16]byte{15: 127}
  100.     fmt.Println(C.i128)
  101.  
  102.     C.ui128 = [16]byte{15: 255}
  103.     fmt.Println(C.ui128)
  104.  
  105.     C.ptr = unsafe.Pointer(nil)
  106.     fmt.Println(C.ptr)
  107.  
  108. }

  

运行后,输出结果如下:(运行环境:Windows 7 64位操作系统,go version go1.8.3 windows/amd64)

  1. true
  2.  
  3. -
  4.  
  5. -
  6.  
  7. -
  8.  
  9. -
  10.  
  11. -
  12.  
  13. 1.1754944e-38
  14. 2.2250738585072014e-308
  15. (+5i)
  16. (+5i)
  17. [ ]
  18. [ ]
  19. <nil>
  20. -------------------------------------------------
  21. true
  22.  
  23. -
  24.  
  25. -
  26.  
  27. -
  28.  
  29. -
  30.  
  31. -
  32.  
  33. -
  34. -
  35. (+5i)
  36. (+5i)
  37. [ ]
  38. [ ]
  39. <nil>

CGO 类型(CGO Types) 一的更多相关文章

  1. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

  2. Go语言规格说明书 之 类型(Types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  3. C#匿名类型 - Anonymous Types

    [C#匿名类型 - Anonymous Types] Anonymous types provide a convenient way to encapsulate a set of read-onl ...

  4. Scala类型系统——高级类类型(higher-kinded types)

    高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors).它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它 ...

  5. django字段类型(Field types)介绍

    字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动 ...

  6. EF中的实体类型【Types of Entity in Entity】(EF基础系列篇8)

    We created EDM for existing database in the previous section. As you have learned in the previous se ...

  7. Entity Framework with MySQL 学习笔记一(复杂类型 Complex Types)

    有时候我们希望在sql一个表里面的column, 一部分被分化成另一个class 典型的例子是 Address 直接看代码: [Table("member")] public cl ...

  8. The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types

    Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对).   Swift语言里的数 ...

  9. objective-C学习笔记(八) 集合类型 Collection Types

    OBJC的集合类型: 1.数组 Array 2.Set 3.键值对 Dictionary 数组:OC中的数组被定义为class,引用类型.索引从0开始,访问越界会抛出运行时异常. NSArray的元素 ...

随机推荐

  1. python并发编程之多进程一

    一,什么是进程 进程是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体: 二,进程与程序的区别 进程即运行中的程序,从中即可知,进程是在运 ...

  2. caffe+opencv3.3dnn模块 完成手写数字图片识别

    最近由于项目需要用到caffe,学习了下caffe的用法,在使用过程中也是遇到了些问题,通过上网搜索和问老师的方法解决了,在此记录下过程,方便以后查看,也希望能为和我一样的新手们提供帮助. 顺带附上老 ...

  3. Tomcat中虚拟路径

    默认情况下,Tomcat访问静态资源配置是这样的 <Context path="/project_name" docBase="d:\tomcat_statics& ...

  4. bootstrap fileinput上传返回400,404,500 等错误替换

    $(".uploadfile").on('filebatchuploaderror', function(event, data, msg) { $(".file-err ...

  5. 企业级LNMP架构搭建实例(基于Centos6.x)

    1.1 部署LNMP架构说明 1.1.1 LNMP架构内容 01.部署linux系统 02.部署nginx网站服务 03.部署mysql数据库服务 04.部署php动态解析服务 1.1.2 配置LNM ...

  6. 小白的Python之路 day1 Python3的bytes/str之别

    原文:The bytes/str dichotomy in Python 3 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二 ...

  7. canvas 从初级到XX 1# 部分非基础原生API的使用 [初级向]

    标题canvas 从初级到XX,XX是因为本文随机都可能会太监,并不会支持到入土.请慎重的往下看. 对于canvas的介绍,随处都可以找到,也就不啰嗦太多了.就直奔主题了. 先看一段代码,以及实现的效 ...

  8. Linux入门命令解释(1)

    第一章Linux安装及服务控制 1.  uname -r              //查看linux版本号 2.cat  /proc/cupinfo      //查看CPU信息 3.cat  /p ...

  9. 自学OpenCV时遇到的一些错误(捂脸ing,当年确实好多不懂...)

    6.8/14 opencv环境配置好了, 属性也设置对了, 但是使用VideoCapture类的时候, 还是出错.  右键可以查看其定义, 但是就是 出错.   漏掉了#include "s ...

  10. 修改Mac系统的文件权限

    修改Mac系统的文件权限 有时候,因为各种各样的需求Mac OS系统使用者需要修改某个系统文件,但是很多时候Mac OS系统会提示你"没有足够的权限".所以往往会无法保侟.编辑甚至 ...