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++数据结构类型对应关系是怎样的?的更多相关文章

  1. golang拾遗:自定义类型和方法集

    golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识. 很久没更新了,我们先以一个谜题开头练练手: package main import ( "encoding ...

  2. Redis的值value(数据结构类型)

    Redis的数据结构类型,指的是redis的值的value类型: Redis的常用数据结构类型:string,list,set,sortedSet,hash 一.sting的类型 string类型是r ...

  3. redis 全局命令 查看所有的键,删除键,检查键是否存在,获取过期时间,键的数据结构类型

    Redis有5中数据结构,他们是键值对中的值,对于键来说,有一些通用的命令: 一.查看所有键 keys * 二.获取键总数:dbsize 三.检查键是否存在 exists 如果存在返回1,不存在返回0 ...

  4. [golang note] 内建类型

    基础类型 √ golang内建基础类型有布尔类型.整数类型.浮点类型.复数类型.字符串类型.字符类型和错误类型. 复合类型 √ golang支持的复合类型有指针.数组.数组切片.字典.通道.结构体和接 ...

  5. Golang中的error类型

    Golang中的error类型 error类型本身就是一个预定义好的接口,里面定义了一个method type error interface { Error() string } 生成一个新的err ...

  6. golang拾遗:嵌入类型

    这里是golang拾遗系列的第三篇,前两篇可以点击此处链接跳转: golang拾遗:为什么我们需要泛型 golang拾遗:指针和接口 今天我们要讨论的是golang中的嵌入类型(embedding t ...

  7. ORACLE与.NET类型对应关系(转)

    ORACLE与.NET类型对应关系 想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键 ...

  8. golang 无法将Slice类型[]a 转换为 Slice[]b

    因为我想做一个通用的Slice方法,AnySlice,但是将AnySlice定义为[]interface{ } 转换到别的类型,或者相互转换的时候都是会报错. 这是golang比较恶心人的一个地方了, ...

  9. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值

    不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return } 通过 ...

  10. Golang | 既是接口又是类型,interface是什么神仙用法?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第12篇文章,我们来继续聊聊interface的使用. 在上一篇文章当中我们介绍了面向对象的一些基本概念,以及gol ...

随机推荐

  1. 基于Pierre Dellacherie的俄罗斯方块-05Pierre Dellacherie算法

    基于Pierre Dellacherie的俄罗斯方块-05Pierre Dellacherie算法 Pierre Dellacherie算法感觉上像是一个遍历算法,给与各个参数不同的权重,使得更加合理 ...

  2. File 未释放文件权柄问题处理

    Unreleased Resource: Files Abstract 程序可能无法释放某个文件句柄. Explanation 程序可能无法成功释放某一个文件句柄. 资源泄露至少有两种常见的原因: - ...

  3. 全网最详细中英文ChatGPT接口文档(四)30分钟快速入门ChatGPT——Models模型

    @ 目录 Models Overview 概述 GPT-4 Limited beta GPT-3.5 Feature-specific models 特定功能的模型 Finding the right ...

  4. graphviz 简单入门

    上一位负责画图的选手 CS Academy 由于不明原因暂时不能继续工作,所以本俱乐部招收了新选手 graphviz. 在 Linux 上,你可以这么下载: sudo apt install grap ...

  5. vue2升级vue3:vue-i18n国际化异步按需加载

    vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage 但是本文还是详细说一遍: 为什么需要异 ...

  6. 解读 Servlet 源码:GenericServlet,ServletConfig,ServletContext

    解读 Servlet 源码:GenericServlet,ServletConfig,ServletContext 每博一文案 人活着,就得随时准备经受磨难.他已经看过一些书,知道不论是普通人还是了不 ...

  7. MySQL 中 explain关键字

    更多内容,前往IT-BLOG explain关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的.分析查询语句或表结构的性能瓶颈.执行语句:explain + ...

  8. JAVA网络编程样例

    这篇文章主要用来总结Java在网络编程中的知识点 下面是一个Java客户端与服务端通信的样例程序 //Server public class Server { public static void m ...

  9. C++/Qt网络通讯模块设计与实现(六)

    前面章节主要讲述网络通讯客户端的实现,各位小伙伴需认真阅读以及理解,理会其中的思想,有疑问的地方可及时给我私信,我都会非常认真地解答大家的疑惑. C++/Qt网络通讯模块设计与实现(一) C++/Qt ...

  10. python入门教程之一 什么是python

    python简介 1 什么是python Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页 ...