2013-05-08 14 views
6

Sono nuovo per il golang, quindi chiedetevi se questa domanda è troppo ingenua. Si guardò intorno, ma non riuscì a trovare una risposta alla mia domanda di base.Tipo cast vs tipo assertion su struct in calcestruzzo?

Diciamo che ho una struttura e metodi concreti come mostrato di seguito.

type MyData struct{ 
    field1 string 
    field2 int 
    } 

func(a MyData) OperatorOnString() string{ 
    return a.field1.(string) 
} 

func(a MyData) OperatorOnInt() int{ 
    return a.field2.(int) 
} 

La mia domanda è, posso digitare il cast e il ritorno anziché eseguire l'asserzione? Da quello che ho imparato finora è che l'asserzione è usata sui dati dell'interfaccia di tipo. Ma in questo caso ho un tipo concreto. Devo ancora usare l'asserzione o posso fare qualcosa come return int(a.field2). So che questo esempio è banale, ma il punto in cui sono confuso è quando utilizzare tra i due tipi di conversione. O c'è qualche idioma golan coinvolto qui?

Grazie

risposta

9

Innanzitutto, type assertion possono essere utilizzati solo su interfacce:

Per un'espressione x di tipo di interfaccia e un tipo T, l'espressione primaria

x.(T) 

afferma che x non è nullo e il valore memorizzato in x è di tipo T. La notazione x.(T) è denominata tipo assertion.

Ma si sta applicando a interfaccia digitato campi non (int e string). Questo rende il compilatore unhappy.

In secondo luogo, se si desidera restituire il tipo T da un metodo/funzione, è sempre sufficiente restituire un'espressione di tipo T, che i campi già risultano essere. Il codice corretto è quindi facile:

package main 

import "fmt" 

type MyData struct { 
     field1 string 
     field2 int 
} 

func (a MyData) OperatorOnString() string { 
     return a.field1 
} 

func (a MyData) OperatorOnInt() int { 
     return a.field2 
} 

func main() { 
     a := MyData{"foo", 42} 
     fmt.Println(a.OperatorOnString(), a.OperatorOnInt()) 
} 

Playground


uscita:

foo 42 
+0

Grazie. Tuttavia, nello scenario reale, i miei operatori avranno alcuni argomenti che verranno utilizzati per operare sui campi MyData. Quindi, prima di restituire quel campo, devo controllare il tipo? – Minty

+0

@Minty: mostra il codice reale. Molto probabilmente stai mescolando diversi concetti e non migliorerà senza codice reale. – Volker

+1

@Minty: se un fn restituisce il tipo 'T' allora solo espressioni di tipo' T' possono apparire in 'return expr'. Non si tratta di campi, si tratta del tipo di espressione. Per esempio. se diciamo che abbiamo 'var i int' in un fn che restituisce' int64', allora possiamo e dobbiamo scrivere 'return int64 (i)'. Annuncio "per verificare il tipo": il controllo del tipo viene eseguito automaticamente dal compilatore. – zzzz

Problemi correlati