2015-07-13 11 views
5

paxPayment, ok = dataObject.(*entities.PassengerPayment)È questo casting in golang?

A cosa servono le parentesi? Non sono sicuro di cosa sta succedendo in questa operazione di assegnazione.

Avete bisogno di ulteriori dettagli per rispondere a questa domanda?

+2

Si chiama [Tipo asserzione] (https://golang.org/ref/spec#Type_assertions). – icza

+0

@icza fa una risposta. – inf

risposta

12

È semplicemente un Type assertion. Un tipo asserzione può essere utilizzata per:

  • ottenere un valore di calcestruzzo tipo da un valore di interfaccia tipo
  • o per ottenere un valore di un tipo differente interfaccia a quello iniziale (un'interfaccia con un diverso method set, praticamente non sottoinsieme di quello originale, che potrebbe essere semplicemente ottenuto utilizzando un semplice tipo conversion).

Citando dalla specifica:

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

x.(T) 

afferma che x non è nil e che il valore memorizzato in x è di tipo T. La notazione x.(T) è denominata affermazione del tipo .

Più precisamente, se T non è un tipo di interfaccia, x.(T) afferma che il tipo dinamico di x è identical al tipo T. In questo caso, T deve implement il tipo (interfaccia) di x; in caso contrario, l'attribuzione del tipo non è valida poiché non è possibile per x memorizzare un valore di tipo T. Se T è un tipo di interfaccia, x.(T) asserisce che il tipo dinamico di x implementa l'interfaccia T.

In modo più specifico il tuo esempio è un formato speciale di esso che riporta anche se il tipo asserzione detiene. In caso contrario, ok sarà false e, se l'affermazione è valida, ok sarà true.

Questa particolare forma mai panico a differenza della forma di:

paxPayment = dataObject.(*entities.PassengerPayment) 

che se dataObject non detiene una valore di tipo *entities.PassengerPayment sarà prendere dal panico.