2022-06-18:golang与 C++数据结构类型对应关系是怎样的?
2022-06-18:golang与 C++数据结构类型对应关系是怎样的?
答案2022-06-18:
uintptr和unsafe.Pointer相当于c++的void*,也就是任意指针。
uintptr可以参与指针运算,unsafe.Pointer不能参与指针运算。
c++和golang对照表如下:
| c++类型 | golang类型 | 备注 |
|---|---|---|
| char | byte | |
| char * | string | 函数入参或出参 |
| char * | uintptr或者*byte | 结构体成员或者回调函数参数 ,不能用string |
| byte | byte | |
| byte * | *byte | |
| int16 | int16 | |
| int16 * | *int16 | |
| uint16 | uint16 | |
| uint16 * | *uint16 | |
| int32 | int32 | |
| int32 * | *int32 | |
| uint32 | uint32 | |
| uint32 * | *uint32 | |
| int64 | int64 | |
| int64 * | *int64 | |
| uint64 | uint64 | |
| uint64 * | *uint64 | |
| float | float32 | |
| float* | *float32 | |
| double | float64 | |
| double* | *float64 | |
| bool | bool | |
| void * | uintptr | |
| 结构体 | 结构体 | |
| 结构体* | *结构体 | |
| 枚举 | int32 | |
| typedef 返回类型 (*函数名)(参数列表) | type 函数名=func(参数列表)uintptr | 返回类型占用的内存小于uintptr,需要指定为uintptr |
| 结构体中的函数指针 | uintptr |
go类型和uintptr的相互转换如下:
| go源类型 | go目标类型 | 转换方法 |
|---|---|---|
| int | uintptr | uintptr(a)。byte,int16,int32,int64都可以 |
| uintptr | int | int(a)。byte,int16,int32,int64都可以 |
| *int | uintptr | unsafe.Pointer(a)。所有指针都是这种转换方式,函数指针例外 |
| uintptr | *int | (*int)(unsafe.Pointer(a))。所有指针都是这种转换方式,函数指针例外 |
| float32 | uintptr | unsafe.Pointer(&a)。注意:跟int的不一样 |
| uintptr | float32 | *(*float32)(unsafe.Pointer(&a))。注意:跟int的不一样 |
| float64 | uintptr | unsafe.Pointer(&a)。注意:跟int的不一样 |
| uintptr | float64 | *(*float64)(unsafe.Pointer(&a))。注意:跟int的不一样 |
| 结构体 | uintptr | unsafe.Pointer(&a) |
| uintptr | 结构体 | *(*结构体)(unsafe.Pointer(&a)) |
| string | uintptr | 见代码UintPtrFromString |
| uintptr | string | 见代码StringFromPtr |
| bool | uintptr | 见代码CBool |
| uintptr | bool | 见代码GoBool |
| func | uintptr | syscall.NewCallback(a)或者syscall.NewCallbackCDecl(a)。这是函数指针 |
| uintptr | func | 不知道怎么转换,待定 |
func bytePtrFromString(str string) (res *byte) {
res, _ = syscall.BytePtrFromString(str)
return
}
// string → uintptr
func UintPtrFromString(str string) uintptr {
return uintptr(unsafe.Pointer(bytePtrFromString(str)))
}
// uintptr → string
func StringFromPtr(sptr uintptr) (res string) {
if sptr <= 0 {
return
}
buf := make([]byte, 0)
for i := 0; *(*byte)(unsafe.Pointer(sptr + uintptr(i))) != 0; i++ {
buf = append(buf, *(*byte)(unsafe.Pointer(sptr + uintptr(i))))
}
res = string(buf)
return
}
// uintptr → bool
func GoBool(val uintptr) bool {
if val != 0 {
return true
}
return false
}
// bool → uintptr
func CBool(val bool) uintptr {
if val {
return 1
}
return 0
}
// func转uintptr
func NewCallback(fn interface{}) uintptr {
//return syscall.NewCallbackCDecl(fn)
return syscall.NewCallback(fn)
}

2022-06-18:golang与 C++数据结构类型对应关系是怎样的?的更多相关文章
- golang拾遗:自定义类型和方法集
golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识. 很久没更新了,我们先以一个谜题开头练练手: package main import ( "encoding ...
- Redis的值value(数据结构类型)
Redis的数据结构类型,指的是redis的值的value类型: Redis的常用数据结构类型:string,list,set,sortedSet,hash 一.sting的类型 string类型是r ...
- redis 全局命令 查看所有的键,删除键,检查键是否存在,获取过期时间,键的数据结构类型
Redis有5中数据结构,他们是键值对中的值,对于键来说,有一些通用的命令: 一.查看所有键 keys * 二.获取键总数:dbsize 三.检查键是否存在 exists 如果存在返回1,不存在返回0 ...
- [golang note] 内建类型
基础类型 √ golang内建基础类型有布尔类型.整数类型.浮点类型.复数类型.字符串类型.字符类型和错误类型. 复合类型 √ golang支持的复合类型有指针.数组.数组切片.字典.通道.结构体和接 ...
- Golang中的error类型
Golang中的error类型 error类型本身就是一个预定义好的接口,里面定义了一个method type error interface { Error() string } 生成一个新的err ...
- golang拾遗:嵌入类型
这里是golang拾遗系列的第三篇,前两篇可以点击此处链接跳转: golang拾遗:为什么我们需要泛型 golang拾遗:指针和接口 今天我们要讨论的是golang中的嵌入类型(embedding t ...
- ORACLE与.NET类型对应关系(转)
ORACLE与.NET类型对应关系 想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键 ...
- golang 无法将Slice类型[]a 转换为 Slice[]b
因为我想做一个通用的Slice方法,AnySlice,但是将AnySlice定义为[]interface{ } 转换到别的类型,或者相互转换的时候都是会报错. 这是golang比较恶心人的一个地方了, ...
- golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值
不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return } 通过 ...
- Golang | 既是接口又是类型,interface是什么神仙用法?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第12篇文章,我们来继续聊聊interface的使用. 在上一篇文章当中我们介绍了面向对象的一些基本概念,以及gol ...
随机推荐
- 有时候用uniapp写项目时发现,Map组件在安卓真机可以缩放和移动,但是在ios真机就不行
如果你的地图组件是放到popup组件里,是用弹框打开的,如何ios端不能缩放, 那你一定要看下这个弹框的层级是否比地图层级要高 z-index. 如果高于地图层级,那地图肯定是不能移动和缩放的
- (3)这是一个简单的html页面,请保持为字符串,完成后面的计算要求。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 多线程中使用COM 的注意事项
最近做了一个TCP Server的程序,其中需用使用COM组件,但是tcp 的部分是阻塞的,所以开了一个线程用来专门接收来自客户端的信号,当接收到信号后,再根据情况处理. 按照这个思路,在程序的一开始 ...
- pugixml XML格式处理库的介绍和使用(面向业务编程-格式处理)
pugixml XML格式处理库的介绍和使用(面向业务编程-格式处理) 介绍 pugixml是一个轻量级的C++ XML处理库.它的特点: 类似dom的界面,具有丰富的遍历/修改功能 非常快速的非验证 ...
- 网络安全(中职组)-B模块:服务远程控制
任务四:服务远程控制任务环境说明:服务器场景名:20200609(关闭链接)服务器场景操作系统:未知服务器场景用户名:root服务器场景密码:Admin123 1. 通过本地PC中渗透测试平台K ...
- RPA的概念和优势
大多数人每天都会使用到一些机器人流程自动化的工具,例如读取邮件和系统,计算.生成文件和报告.而在未来,那些你不想做的枯燥的工作,也许真的可以不做了,重复化.标准化的工作都可以让机器人帮你完成.想必此刻 ...
- 声网王浩宇:RTE 场景下的 Serverless 架构挑战【RTE 2022】
前言 在「RTE2022 实时互联网大会」中,声网云原生边缘计算团队的负责人 @王浩宇 Dylan 以<RTE 场景下的 Serverless 架构挑战 -- 声网如何兼顾后端服务的可靠.高效和 ...
- Django笔记一之运行系统、创建视图并访问
从这一篇笔记开始将根据 Django 的官方文档,阅读整理之后,出一系列笔记教程,用作新手入门教程或者自己做查阅. 此次 Django 的版本为 3.2,且之后的一系列笔记都将以这个版本为基础,做功能 ...
- Windows无线连接路由器成功但无法网
Windows10连接Wifi成功,任务栏无线图标没有感叹号,但是无法连接到网络,重启电脑才能连接上,手机连接这个网络却可以一直联通.本人使用的是intel 9260无线网卡,经过测试,我通过这个方法 ...
- Win系统下的免杀思路(总结非教程)
1.简介 在安全厂商日趋成熟的背景下,编写免杀马的难度和成本日益增长.好用新兴的开源项目在短时间内就被分析并加入特征库.笔者调研了部分开源项目,其中也有项目做了类似的分析 [1],目前能够免杀的项目初 ...