为什么没有"字节"在反射包中有什么样的?

时间:2016-06-12 01:47:28

标签: reflection go types

我在Go的reflect包中看到了各种Kind枚举。但没有byte

为什么?其他数字类型之间存在明确的区别。为什么不byte?我们应该假设uint8吗?

1 个答案:

答案 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 uint8A will have distinct reflect.Types 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>