cgo c数组_golang之cgo一---go与C基本类型转换

本文介绍了Go语言使用cgo与C进行交互时的基本类型转换,包括char、unsigned char、short int、int、long int、float、double、void *等类型的转换,并提供了示例代码演示如何进行Go到C以及C到Go的数据转换。同时,文章还展示了如何处理C的字符串和结构体,以及在Go中调用C函数的方法。
摘要由CSDN通过智能技术生成

在嵌入式开发中总少不了和C/C++打交道,而在开发中也总有某些需求要用到某些其他工具的特性,比如go语言。

Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。

Go语言的语法接近C语言,但是对于变量的声明是不同的,其他语法不同之处是For循环和if判断语句不需要用小括号括起来。Go语言支持垃圾回收功能。

与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了slice型、并发、管道、垃圾回收、接口(interface)等特性的语言级支持。

当前有两个Go语言的编译器的分支。官方编译器gc和gccgo。官方编译器支持跨平台编译(但不支持CGO)

go还可以嵌入C代码,但是不可以嵌入C++代码,当然也可以通过某些方式调用C++ API(如SWIG),本文主要讲CGO。怎么嵌入C或者调用动态库就简单略过了,主要注意下:

可以用注释符//和/**/包围C代码

import “C” 和包含C代码之间是没有空行的

动态库的导入和编译选项通过LDFLAGS、CFLAGS/CXXFLAGS来设置

还可以用pkg-config #cgo pkg-config : xxxxname

编译宏定义指定#cgo CFLAGS: -DNDEBUG -DXXXX=2

今天先看看go和c之间的类型转换:

char --> C.char --> byte

signed char --> C.schar --> int8

unsigned char --> C.uchar --> uint8

short int --> C.short --> int16

short unsigned int --> C.ushort --> uint16

int --> C.int --> int

unsigned int --> C.uint --> uint32

long int --> C.long --> int32 or int64

long unsigned int --> C.ulong --> uint32 or uint64

long long int --> C.longlong --> int64

long long unsigned int --> C.ulonglong --> uint64

float --> C.float --> float32

double --> C.double --> float64

wchar_t --> C.wchar_t -->

void * -> unsafe.Pointer

编程测试:

package main

/*

#include

#include

char ch = 'M';

unsigned char uch = 253;

short st = 233;

int i = 257;

long lt = 11112222;

float f = 3.14;

double db = 3.15;

void * p;

char *str = "const string";

char str1[64] = "char array";

void printI(void *i)

{

printf("print i = %d\n", (*(int *)i));

}

struct ImgInfo {

char *imgPath;

int format;

unsigned int width;

unsigned int height;

};

void printStruct(struct ImgInfo *imgInfo)

{

if(!imgInfo) {

fprintf(stderr, "imgInfo is null\n");

return ;

}

fprintf(stdout, "imgPath = %s\n", imgInfo->imgPath);

fprintf(stdout, "format = %d\n", imgInfo->format);

fprintf(stdout, "width = %d\n", imgInfo->width);

}

*/

import "C"

import (

"fmt"

"reflect"

"unsafe"

)

func main() {

fmt.Println("----------------Go to C---------------")

fmt.Println(C.char('Y'))

fmt.Printf("%c\n", C.char('Y'))

fmt.Println(C.uchar('C'))

fmt.Println(C.short(254))

fmt.Println(C.long(11112222))

var goi int = 2

// unsafe.Pointer --> void *

cpi := unsafe.Pointer(&goi)

C.printI(cpi)

fmt.Println("----------------C to Go---------------")

fmt.Println(C.ch)

fmt.Println(C.uch)

fmt.Println(C.st)

fmt.Println(C.i)

fmt.Println(C.lt)

f := float32(C.f)

fmt.Println(reflect.TypeOf(f))

fmt.Println(C.f)

db := float64(C.db)

fmt.Println(reflect.TypeOf(db))

fmt.Println(C.db)

// 区别常量字符串和char数组,转换成Go类型不一样

str := C.GoString(C.str)

fmt.Println(str)

fmt.Println(reflect.TypeOf(C.str1))

var charray []byte

for i := range C.str1 {

if C.str1[i] != 0 {

charray = append(charray, byte(C.str1[i]))

}

}

fmt.Println(charray)

fmt.Println(string(charray))

for i := 0; i < 10; i++ {

imgInfo := C.struct_ImgInfo{imgPath: C.CString("../images/xx.jpg"), format: 0, width: 500, height: 400}

defer C.free(unsafe.Pointer(imgInfo.imgPath))

C.printStruct(&imgInfo)

}

fmt.Println("----------------C Print----------------")

}

输出结果:

----------------Go to C---------------

89

Y

67

254

11112222

----------------C to Go---------------

77

253

233

257

11112222

float32

3.14

float64

3.15

const string

[64]main._Ctype_char

[99 104 97 114 32 97 114 114 97 121]

char array

----------------C Print----------------

print i = 2

imgPath = ../images/xx.jpg

format = 0

width = 500

imgPath = ../images/xx.jpg

format = 0

width = 500

imgPath = ../images/xx.jpg

format = 0

width = 500

imgPath = ../images/xx.jpg

format = 0

width = 500

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值