• CGO 类型(CGO Types) 一


    CGO Types

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

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

      查询C99标准文档(6.2.5 Types),主要类型包括:_Boolcharsigned charunsigned charshortunsigned shortintunsigned intlongunsigned longlong longunsigned long longfloatdoublelong doublefloat _Complexdouble _Complexlong double _Complexvoid *__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 doublelong double _ComplexCGO中不能引用,编译报错。

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

    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
    65
    -128
    255
    -32768
    65535
    -2147483648
    4294967295
    -2147483648
    4294967295
    -9223372036854775808
    18446744073709551615
    1.1754944e-38
    2.2250738585072014e-308
    (5+5i)
    (5+5i)
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]
    <nil>
    -------------------------------------------------
    true
    65
    -128
    255
    -32768
    65535
    -2147483648
    4294967295
    -2147483648
    4294967295
    -9223372036854775808
    18446744073709551615
    -1
    -1
    (5+5i)
    (5+5i)
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255]
    <nil>
  • 相关阅读:
    SpringBoot 线程池配置 定时任务,异步任务
    ArcMap 5 同一地区,多图层不能一起显示
    ArcMap 4 完全卸载ArcGIS
    ArcMap 3 矢量数据下载(下载、应用需谨慎)
    ArcMap 2 数据矢量化
    MODIS系列之NDVI(MOD13Q1)九:单一土地类型NDVI及时序图(以耕地类型为例)
    ArcMap 1 矢量数据和栅格数据
    ArcMap 0 (ArcGIS10.2安装(完善版--能解决常见问题))
    MODIS系列之NDVI(MOD13Q1)八:土地利用数据(又称地表覆盖数据)下载
    MODIS系列之NDVI(MOD13Q1)七:时间序列S-G滤波之Python
  • 原文地址:https://www.cnblogs.com/majianguo/p/7650059.html
Copyright © 2020-2023  润新知