2022-06-18:golang与 C++数据结构类型对应关系是怎样的?

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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类型备注
charbyte
char *string函数入参或出参
char *uintptr或者*byte结构体成员或者回调函数参数 ,不能用string
bytebyte
byte **byte
int16int16
int16 **int16
uint16uint16
uint16 **uint16
int32int32
int32 **int32
uint32uint32
uint32 **uint32
int64int64
int64 **int64
uint64uint64
uint64 **uint64
floatfloat32
float**float32
doublefloat64
double**float64
boolbool
void *uintptr
结构体结构体
结构体**结构体
枚举int32
typedef 返回类型 (*函数名)(参数列表)type 函数名=func(参数列表)uintptr返回类型占用的内存小于uintptr,需要指定为uintptr
结构体中的函数指针uintptr

go类型和uintptr的相互转换如下:

go源类型go目标类型转换方法
intuintptruintptr(a)。byte,int16,int32,int64都可以
uintptrintint(a)。byte,int16,int32,int64都可以
*intuintptrunsafe.Pointer(a)。所有指针都是这种转换方式,函数指针例外
uintptr*int(*int)(unsafe.Pointer(a))。所有指针都是这种转换方式,函数指针例外
float32uintptrunsafe.Pointer(&a)。注意:跟int的不一样
uintptrfloat32*(*float32)(unsafe.Pointer(&a))。注意:跟int的不一样
float64uintptrunsafe.Pointer(&a)。注意:跟int的不一样
uintptrfloat64*(*float64)(unsafe.Pointer(&a))。注意:跟int的不一样
结构体uintptrunsafe.Pointer(&a)
uintptr结构体*(*结构体)(unsafe.Pointer(&a))
stringuintptr见代码UintPtrFromString
uintptrstring见代码StringFromPtr
booluintptr见代码CBool
uintptrbool见代码GoBool
funcuintptrsyscall.NewCallback(a)或者syscall.NewCallbackCDecl(a)。这是函数指针
uintptrfunc不知道怎么转换,待定
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)

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于2022-06-18:golang与 C++数据结构类型对应关系是怎样的?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 哈希表查询_进入哈希函数结界的世界

C++-Golang的数组类型异同

Golang学习笔记-基础数据类型

Golang学习笔记-基础数据类型

golang中结构体

JAVA开发者的Golang快速指南