2016-06-12 32 views

回答

8

是,byte is an alias for uint8:「所有數值類型是不同的除了byte,其是用於uint8的別名,rune,這是一個別名int32」(斜體礦)。您甚至可以編寫代碼,如var x []uint8 = []byte("hi!")and it compiles

由於除了編寫源代碼之外沒有區別,reflect程序包在運行時在RAM中操作(相同)結構時不能做很多特殊的操作。

多想想Kind小號具體而言,它們是指數據存儲而非類型名稱。因此,舉例來說,如果你聲明type A uint8,和類型A變量uint8will 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 

所以,雖然這是一個有點傻去想假設語言,即使轉到byte是一個獨特的類型而不是別名,他們有相同的reflect.Kind

+0

很酷,我沒有意識到它被語言規範定義爲別名。 (爲什麼符文是'int32'而不是'uint32',呵呵?) – chowey

+0

很難說!字節必須是無符號的,因爲所有的值都是有效的,並且約定它們是0-255。對於Unicode代碼點,他們有一個選擇,因爲不超過2^31個代碼點。我認爲他們更喜歡在某些地方簽名ints(比如數組索引),因爲unsigned wraparound('0-1 == 0xffffffff')可能不直觀。另一方面,位移量被定義爲uint! (也許這是因爲試圖進行負面轉變可能會以與架構相關的方式發生奇怪的行爲,而不僅僅是因爲慣例而失效。) – twotwotwo