【问题标题】:Why is there no "byte" kind in the reflect package?为什么反射包中没有“字节”类型?
【发布时间】:2016-10-12 16:57:13
【问题描述】:

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

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

【问题讨论】:

    标签: reflection go types


    【解决方案1】:

    是的,byte is an alias for uint8:“所有数字类型都是不同的除了byte,这是uint8 的别名,rune,这是int32 的别名” (斜体我的)。你甚至可以编写像var x []uint8 = []byte("hi!")and it compiles 这样的代码。

    由于除了源代码的编写方式之外没有任何区别,因此reflect 包在运行时处理 RAM 中的(相同的)结构时并没有什么特别之处。

    具体考虑Kinds,它们指的是数据存储,而不是类型名称。因此,例如,如果您声明 type A uint8,则类型为 Auint8 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-255。对于 Unicode 代码点,他们有一个选择,因为代码点不超过 2^31 个。我认为他们在某些地方(如数组索引)不太喜欢有符号整数,因为无符号环绕(0-1==0xffffffff)可能不直观。另一方面,位移量被定义为单位! (也许那是因为尝试进行负向转变可能会以依赖于架构的方式出现奇怪的行为,而不仅仅是按照惯例无效。)
    猜你喜欢
    • 2010-09-26
    • 2020-09-03
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多