【发布时间】:2016-10-12 16:57:13
【问题描述】:
我在 Go 的 reflect 包中看到了各种 Kind 枚举。但是没有byte。
这是为什么呢?其他数字类型之间有明确的区别。为什么不byte?我们应该假设uint8 吗?
【问题讨论】:
标签: reflection go types
我在 Go 的 reflect 包中看到了各种 Kind 枚举。但是没有byte。
这是为什么呢?其他数字类型之间有明确的区别。为什么不byte?我们应该假设uint8 吗?
【问题讨论】:
标签: reflection go types
是的,byte is an alias for uint8:“所有数字类型都是不同的除了byte,这是uint8 的别名,rune,这是int32 的别名” (斜体我的)。你甚至可以编写像var x []uint8 = []byte("hi!")and it compiles 这样的代码。
由于除了源代码的编写方式之外没有任何区别,因此reflect 包在运行时处理 RAM 中的(相同的)结构时并没有什么特别之处。
具体考虑Kinds,它们指的是数据存储,而不是类型名称。因此,例如,如果您声明 type A uint8,则类型为 A 和 uint8 will have distinct reflect.Types but the same Kind 的变量:
package main
import (
"fmt"
"reflect"
)
type A uint8
func main() {
x, y := A(1), uint8(1)
valX, valY := reflect.ValueOf(x), reflect.ValueOf(y)
fmt.Println("Types: x is", valX.Type(), "y is", valY.Type())
fmt.Println("Types match:", valX.Type() == valY.Type())
fmt.Println("Kinds: x is", valX.Kind(), "y is", valY.Kind())
fmt.Println("Kinds match:", valX.Kind() == valY.Kind())
}
有输出
Types: x is main.A y is uint8
Types match: false
Kinds: x is uint8 y is uint8
Kinds match: true
因此,尽管考虑假设语言有点愚蠢,但即使 Go byte 是一个不同的类型而不是别名,它们也会有相同的 reflect.Kind。
【讨论】:
int32 而不是uint32,嗯?)
0-1==0xffffffff)可能不直观。另一方面,位移量被定义为单位! (也许那是因为尝试进行负向转变可能会以依赖于架构的方式出现奇怪的行为,而不仅仅是按照惯例无效。)