CGO 类型(CGO Types) 一
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中不能引用,编译报错。
写一个简单的程序来演示下:
package main /*
#include <limits.h>
#include <float.h> _Bool b = 1;
char c = 'A';
signed char sc = CHAR_MIN;
unsigned char usc = UCHAR_MAX;
short s = SHRT_MIN;
unsigned short us = USHRT_MAX; int i = INT_MIN;
unsigned int ui = UINT_MAX; long l = LONG_MIN;
unsigned long ul = ULONG_MAX; long long ll = LONG_LONG_MIN;
unsigned long long ull = ULONG_LONG_MAX; float f = FLT_MIN;
double d = DBL_MIN;
long double ld = LDBL_MIN; float _Complex fc = 5+5i;
double _Complex dc = 5+5i;
long double _Complex ldc = 5+5i; __int128_t i128 = 0;
__uint128_t ui128 = 3.4028236692093846346337460743177e+38; void *ptr = 0; */
import "C"
import "fmt"
import "unsafe" func main() {
fmt.Println(C.b) fmt.Println(C.c)
fmt.Println(C.sc)
fmt.Println(C.usc) fmt.Println(C.s)
fmt.Println(C.us) fmt.Println(C.i)
fmt.Println(C.ui) fmt.Println(C.l)
fmt.Println(C.ul) fmt.Println(C.ll)
fmt.Println(C.ull) fmt.Println(C.f)
fmt.Println(C.d)
//fmt.Println(C.ld) fmt.Println(C.fc)
fmt.Println(C.dc)
//fmt.Println(C.ldc) fmt.Println(C.i128)
fmt.Println(C.ui128) fmt.Println(C.ptr) fmt.Println("-------------------------------------------------")
fmt.Println(C._Bool(true)) fmt.Println(C.char('A'))
fmt.Println(C.schar(-128))
fmt.Println(C.uchar(255)) fmt.Println(C.short(C.SHRT_MIN))
fmt.Println(C.ushort(C.USHRT_MAX)) fmt.Println(C.int(C.INT_MIN))
fmt.Println(C.uint(C.UINT_MAX)) fmt.Println(C.long(C.LONG_MIN))
fmt.Println(C.ulong(C.ULONG_MAX)) fmt.Println(C.longlong(C.LONG_LONG_MIN))
fmt.Println(C.ulonglong(18446744073709551615)) fmt.Println(C.float(-1))
fmt.Println(C.double(-1))
//fmt.Println(C.longdouble(1)) fmt.Println(C.complexfloat(5 + 5i))
fmt.Println(C.complexdouble(5 + 5i)) C.i128 = [16]byte{15: 127}
fmt.Println(C.i128) C.ui128 = [16]byte{15: 255}
fmt.Println(C.ui128) C.ptr = unsafe.Pointer(nil)
fmt.Println(C.ptr) }
运行后,输出结果如下:(运行环境:Windows 7 64位操作系统,go version go1.8.3 windows/amd64)
true - - - - - 1.1754944e-38
2.2250738585072014e-308
(+5i)
(+5i)
[ ]
[ ]
<nil>
-------------------------------------------------
true - - - - - -
-
(+5i)
(+5i)
[ ]
[ ]
<nil>
CGO 类型(CGO Types) 一的更多相关文章
- Django文档——Model字段类型(Field Types)
大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...
- Go语言规格说明书 之 类型(Types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- C#匿名类型 - Anonymous Types
[C#匿名类型 - Anonymous Types] Anonymous types provide a convenient way to encapsulate a set of read-onl ...
- Scala类型系统——高级类类型(higher-kinded types)
高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors).它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它 ...
- django字段类型(Field types)介绍
字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动 ...
- 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 ...
- Entity Framework with MySQL 学习笔记一(复杂类型 Complex Types)
有时候我们希望在sql一个表里面的column, 一部分被分化成另一个class 典型的例子是 Address 直接看代码: [Table("member")] public cl ...
- The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types
Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对). Swift语言里的数 ...
- objective-C学习笔记(八) 集合类型 Collection Types
OBJC的集合类型: 1.数组 Array 2.Set 3.键值对 Dictionary 数组:OC中的数组被定义为class,引用类型.索引从0开始,访问越界会抛出运行时异常. NSArray的元素 ...
随机推荐
- 手动编译 Nginx 并安装 VeryNginx
VeryNginx 是个非常有意思且便捷的 Nginx 扩展程序.最近新开了台 VPS,便想体验一下它带来的快感. VeryNginx 有个不超过 5 行的安装方法,但作为强迫症我更喜欢使用自己编译的 ...
- Python入门 - 时间处理
本讲主要介绍python时间处理方式,比如获取当前的时间: import time ftime = time.strftime("%Y年%m月%d日%H点%M分%S秒", time ...
- Java编程学习技巧和方法总结
干货:必须要有反馈,不断调整,多读书,多些笔记. 解释:不练习你以为你能掌握?笑话,只有自己根据一个个小目标不断的敲,运行,给予你反馈,这样才会真的进步. 纸上谈Java,是永远停止在口. 关于笔 ...
- P1092 虫食算
题目传送:https://www.luogu.org/problem/show?pid=1092 #include <iostream> #include <cstring> ...
- CCF-201509-1-数列分段
问题描述 试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共 ...
- liunx
一键安装地址:https://lnmp.org/install.html
- Jarvis OJ - [XMAN]level0 - Writeup
差不多最简单的pwn了吧,不过本菜鸟还是要发出来镇楼 分析一下,checksec 查看程序的各种保护机制 没有金丝雀,没有pie 执行时输出Hello,World,在进行输入,溢出嘛 开工 丢到id ...
- Windows下编译nginx-rtmp-module
http://nginx.org/en/docs/howto_build_on_win32.html 官网上的操作说明. 官网的方法Nginx编译方法,思路是一致的,只是有几个细节地方需要调整. 需要 ...
- MySQL InnoDB四个事务级别 与 脏读、不反复读、幻读
MySQL InnoDB事务隔离级别脏读.可反复读.幻读 希望通过本文.能够加深读者对ySQL InnoDB的四个事务隔离级别.以及脏读.不反复读.幻读的理解. MySQL InnoDB事务的隔离级别 ...
- HDOJ--4893--Wow! Such Sequence!【线段树+单点、区间更新】
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 题意:给你一个长度n的数列,初始都为0.有三种操作,第一种给第k个位置的数加d.另外一种是查询区间 ...