Golang中ArbitraryType的存在及其用途
Golang中ArbitraryType的存在及其用途
// ArbitraryType 仅用于文档目的,实际上并非 unsafe 包的一部分。它表示任意 Go 表达式的类型。 type ArbitraryType int
我看到 unsafe 包中有一个 ArbitraryType 的类型声明,但注释写着 …并且实际上并非 unsafe 包的一部分…
我们还有一个类型 Pointer,它似乎是 ArbitraryType 的类型别名,而 ArbitraryType 本身看起来像是 int 的类型别名。那么 ArbitraryType 实际上代表什么,它的目的和意义是什么?谢谢。
更多关于Golang中ArbitraryType的存在及其用途的实战教程也可以访问 https://www.itying.com/category-94-b0.html
另一个问题,为什么不直接使用 type Pointer *int?
更多关于Golang中ArbitraryType的存在及其用途的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢,那么当有人进行类似 Pointer(&objectOfSomeType) 的转换时,它会被强制转换为 int* / *int 吗?
据我所见…
类型
Pointer似乎是ArbitraryType的类型别名,而ArbitraryType本身看起来像是int的类型别名。
这是一个占位符。unsafe.Pointer 的定义是:
type Pointer *ArbitraryType
因为它是一个指向任意类型的指针,而不是任意类型本身。ArbitraryType 本可以定义为 T,然后将 Pointer 定义为 *T,但那样人们就会问“T 是什么?”。
他们想在那里展示某些东西,以表明 unsafe.Pointer 类型是一个指针类型,而不是像 string、切片、映射等那样的不透明类型。
谢谢,那么当有人进行像
Pointer(&objectOfSomeType)这样的转换时,它会被转换为int* / *int吗?
不会。正如文档所说,ArbitraryType 仅用于文档目的。在文档中,他们本可以写成:
type ArbitraryType *byte
或者
type ArbitraryType *bool
等等。unsafe.Pointer 在文档中仅定义为 type unsafe.Pointer *ArbitraryType。它的解引用类型实际上并不是 ArbitraryType。
所有指针类型除了 unsafe.Pointer 之外,都有一个底层类型。如果你有一个 *string,你可以解引用它并得到一个 string,*int 解引用得到 int 也是如此。unsafe.Pointer 则不同。它是“不安全的”。你不能解引用它,因为类型系统不知道另一端是什么。它可能是一个指向 string 的指针,也可能是指向 int 的指针,或者是一个 [0]byte,等等。
它与 interface{} 类似,因为类型系统不“知道”里面是什么。区别在于,interface{} 包含运行时信息,因此在运行时,你可以通过类型断言推断出 interface{} 中包含什么值。unsafe.Pointer 只是一个指向内存中某个东西的指针,不包含那个运行时类型信息,因此你不能对 unsafe.Pointer 进行类型断言。


