Type Assertion

Um type assertion fornece acesso ao valor concreto subjacente de um valor de interface.

Quando a instância de uma struct é convertida para uma interface, essa instância continua existindo, porém agora só temos acesso aos métodos que a interface permite.

Observe, por exemplo, que quando convertemos uma instância do tipo Pessoa (veja o exemplo anterios), perdemos acesso aos campos da struct e aos métodos não definidos pela interface:


carlito := Pessoa{"Carlito da Silva"}
var falador Falador = carlito

// Não temos mais acesso
fmt.Println(carlito.Nome)
fmt.Println(carlito.Gritar("Bingo"))
                        

Apesar de não termos mais acesso a estes valores, podemos recuperá-los ao convertemos a interface para o seu tipo original. Isso porque, debaixo dos panos, Go deixa "guardada" a sua instância original.


carlitoRecuperado := falador.(Pessoa)

// Agora temos acesso
fmt.Println(carlitoRecuperado.Nome)
fmt.Println(carlitoRecuperado.Gritar("Bingo"))
                        
type_assertion.go