我在Go的reflect
包中看到了各种Kind枚举。但没有byte
。
为什么?其他数字类型之间存在明确的区别。为什么不byte
?我们应该假设uint8
吗?
答案 0 :(得分:9)
是的,byte
is an alias for uint8
:"所有数字类型都是不同的,除了 byte
,这是uint8
的别名,{{1} },这是rune
"的别名; (斜体矿)。您甚至可以编写int32
and it compiles之类的代码。
由于除了如何编写源代码之外没有什么区别,var x []uint8 = []byte("hi!")
封装在操作RAM中的(相同)结构时对reflect
做了很多特殊处理在运行时。
更多地考虑byte
具体而言,它们指的是数据存储而不是类型名称。因此,例如,如果您声明Kind
,则type A uint8
和A
will have distinct reflect.Type
s but the same Kind
类型的变量:
uint8
有输出
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())
}
因此,考虑假设语言并不是很愚蠢,即使Go Types: x is main.A y is uint8
Types match: false
Kinds: x is uint8 y is uint8
Kinds match: true
是一个独特的类型而不是别名,它们也会有相同的byte
。< / p>