转换为*ptrdiff\t的Go类型?

转换为*ptrdiff\t的Go类型?,go,cgo,Go,Cgo,在调用C函数的Go程序中,我可以成功地从int转换为ptrdiff\u t。(尽管Go类型对于任何现代体系结构来说都太小,但有点担心的是,即使是int8也能成功编译。)但是*int到*ptrdiff\u t会产生编译器错误:无法将(type*int)转换为type*\Ctype\ptrdiff\u t。允许成功编译的唯一类型是int64。我意识到我可以将变量声明为(*)C.ptrdiff\u t,但我想了解相应的Go类型以及Go编译器在此实例中的意外行为?ptrdiff\u t是一种特定大小的整

在调用C函数的Go程序中,我可以成功地从
int
转换为
ptrdiff\u t
。(尽管Go类型对于任何现代体系结构来说都太小,但有点担心的是,即使是
int8
也能成功编译。)但是
*int
*ptrdiff\u t
会产生编译器错误:
无法将(type*int)转换为type*\Ctype\ptrdiff\u t
。允许成功编译的唯一类型是
int64
。我意识到我可以将变量声明为(*)C.ptrdiff\u t,但我想了解相应的Go类型以及Go编译器在此实例中的意外行为?

ptrdiff\u t是一种特定大小的整数类型。将另一个整数类型转换为ptrdiff_t时,编译器会重新调整该整数的大小。换句话说,它更改旧整数的内存表示形式以匹配新类型。然后,这个新的表示被放在内存中的不同位置

指针是内存中的一个位置。因此,只能转换为指向相同内存布局的类型。int64与ptrdiff大小相同,因此内存表示形式相同,指针可以自由转换

如果希望转换任意整数类型,则需要首先更改其内存中的表示形式,并通过将其分配给变量并获取其指针来为其指定一个新位置

newtype := ptrdiff_t(oldInt)
pnewtype := &newtype

啊哈,我缺少的一点是int8将被扩展到适当的大小。假设我在ptrdiff_t为32位的环境中编译,那么使用int64将触发警告或错误。这让我相信使用*int64作为与*ptrdiff_t等效的Go只适用于64位构建。是否有一种架构不可知的Go类型可以工作?我尝试了uintptr,因为它的大小保证可以容纳指针(因此应该适合容纳指针之间的差异),但Go不允许转换。@errcw,在Go中,要将指向具体类型实例的指针转换为
uintptr
,必须先将其转换为
不安全的指针,这是可行的:
x:=x{};var p uintpttr=uintpttr(unsafe.Pointer(&x))
这已经足够公平了,但这仍然让我想知道映射到*C.ptrdiff\t的正确架构不可知Go类型是什么。