2016-04-11 20 views
5

Pensavo che non consentisse alcun tipo di nome all'assegnazione del tipo attuale senza conversione di tipo esplicita.Perché golang consente l'assegnazione del tipo di slice con nome senza conversione di tipo esplicita?

Ma come si compila senza errori se assegno []byte a json.RawMessage?

var a json.RawMessage // type RawMessage []byte 
var b []byte 

a = b 

var x time.Duration // type Duration int64 
var y int64 

x = y // ERROR: cannot use y (type int64) as type time.Duration in assignment 

https://play.golang.org/p/oD5LwJl7an

+2

Poiché int è un tipo di nome e la matrice è un tipo senza nome. Vedi http://stackoverflow.com/questions/19334542/why-can-i-type-alias-functions-and-use-them-without-casting – LibertyLocked

+0

@LibertyLocked Int64 è un tipo denominato? qual è il vero tipo dietro di esso? L'array di byte – woodings

+0

è composto da un tipo esistente, 'byte', mentre' byte' stesso è un tipo letterale, non composto da alcun tipo esistente – LibertyLocked

risposta

4

int64 è un tipo di nome, []byte è un tipo unamed.

I tipi denominati sono specificati da un nome di tipo (possibilmente qualificato); tipi senza nome vengono specificati utilizzando un tipo letterale, che compone un nuovo tipo da tipi esistenti - golang spec

anche

Due tipi di nome sono identici se i loro nomi di tipo hanno origine nella stessa TypeSpec. Un nome e un tipo senza nome sono sempre diversi. Due tipi senza nome sono identici se i letterali di tipo corrispondente sono identici, cioè se hanno la stessa struttura letterale e i corrispondenti componenti hanno tipi identici. - golang spec

Pertanto

type MyByteArray []byte 
type MyInt int 

var a MyByteArray 
var b []byte 
a = b // legal because array is unnamed - their corresponding type literals are identical 

var x MyInt 
var y int 
x = y // illegal because int is named - they don't originate in the same type spec 

vedi anche Why can I type alias functions and use them without casting?

Problemi correlati