Goのreflect
パッケージには、すべてKindの列挙型があります。しかし、いいえbyte
。リフレクトパッケージに「バイト」の種類がないのはなぜですか?
なぜですか?他の数値型との間には明確な区別があります。どうしてですかbyte
?代わりにuint8
とする予定ですか?
Goのreflect
パッケージには、すべてKindの列挙型があります。しかし、いいえbyte
。リフレクトパッケージに「バイト」の種類がないのはなぜですか?
なぜですか?他の数値型との間には明確な区別があります。どうしてですかbyte
?代わりにuint8
とする予定ですか?
はい、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
を宣言するのであれば、例えば、種類A
とuint8
will have distinct reflect.Type
s 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
。
私はそれが言語仕様によってエイリアスとして定義されていたことに気付きませんでした。 (なぜ、ルーンは 'uint32'の代わりに' int32'ですか、なぜですか?) – chowey
難しいです!すべての値が有効で、0-255であるという規約があるため、バイトは符号なしでなければなりません。 Unicodeコードポイントでは、2^31以下のコードポイントがあるため、選択肢がありました。私は符号なしラップアラウンド( '0-1 == 0xffffffff')が直感的ではないので、(配列インデックスのような)署名されたintを弱く好むと思います。一方、ビットシフト量はuintと定義されています! (おそらく、負のシフトをしようとすると、慣習によって無効になるのではなく、アーキテクチャに依存した方法で変な動作をする可能性があります)。 – twotwotwo