2016-06-12 10 views

答えて

8

はい、byte is an alias for uint8:(イタリック体は私)「すべての数値タイプはint32の別名である、uint8の別名であるbyte除くと、rune別個です」。 var x []uint8 = []byte("hi!")and it compilesのようなコードを書くことさえできます。

実行時にRAM内の(同一の)構造体を操作する場合、reflectパッケージは、ソースがどのように書き込まれるかを除いて違いはないので、byteで特別なことはできません。 Kindの詳細を考える

は、具体的には、彼らがデータストレージではなくタイプ名を参照してください。あなたがtype A uint8を宣言するのであれば、例えば、種類Auint8will have distinct reflect.Types but the same Kindの変数:それはたとえゴーbyte、架空の言語を考えるには少し愚かだけれども

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 

を持っていますエイリアスではなく別のタイプであった場合、同じものになりますreflect.Kind

+0

私はそれが言語仕様によってエイリアスとして定義されていたことに気付きませんでした。 (なぜ、ルーンは 'uint32'の代わりに' int32'ですか、なぜですか?) – chowey

+0

難しいです!すべての値が有効で、0-255であるという規約があるため、バイトは符号なしでなければなりません。 Unicodeコードポイントでは、2^31以下のコードポイントがあるため、選択肢がありました。私は符号なしラップアラウンド( '0-1 == 0xffffffff')が直感的ではないので、(配列インデックスのような)署名されたintを弱く好むと思います。一方、ビットシフト量はuintと定義されています! (おそらく、負のシフトをしようとすると、慣習によって無効になるのではなく、アーキテクチャに依存した方法で変な動作をする可能性があります)。 – twotwotwo

関連する問題