2016-05-14 17 views
13

Nel libro "Go in Action", l'autore ha scritto "I valori di due diversi tipi non possono essere assegnati l'uno all'altro, anche se sono compatibili".Perché posso assegnare un valore di tipo diverso a una variabile?

Ad esempio, non possiamo assegnare Duration a int64 o int64 a Duration.

Ma questo non è sempre vero, la seguente assegnazione funzionerebbe come il valore X viene riconvertito []int automaticamente:

type X []int 
var v []int = X([]int{1, 2, 3}) 

Qual è la differenza tra queste due situazioni?

risposta

11

ti rimando al spec e stralcio delle linee più significative qui:

Un valore x è assegnabile a una variabile di tipo T ("x è assegnabile a T") in uno di questi casi:

...

  • di x tipo V e T hanno tipi sottostanti identici e almeno uno di V o T non è un tipo di nome.

Nel tuo esempio il tipo sottostante è []int per ogni caso e []int non è un tipo di nome, ma una fetta. Un int costituirebbe effettivamente un tipo di nome (predichiarata nel blocco dell'universo) e avrebbe se stesso come un tipo sottostante, ma []int non è un tipo chiamato come dettagliato here:

istanze denominate di booleano, numerico e i tipi di stringa sono predeclared. Tipi di composizione: array, struct, pointer, function, interfaccia , slice, map e tipi di canali, possono essere costruiti utilizzando i letterali del tipo .

Ogni tipo T ha un tipo sottostante: Se T è uno dei predichiarati booleana, tipo numerico o stringa, o un tipo letterale, il corrispondente tipo sottostante è T stessa. In caso contrario, il sottostante tipo T è il tipo sottostante del tipo a cui T fa riferimento nella sua dichiarazione tipo .

Quindi se provato a fare type X int si non in grado di assegnarlo a var v int come int è un tipo di nome e non soddisferebbe i criteri di cedibilità riportati nelle specifiche.

Problemi correlati