Sobes.tech
Junior — Middle

Como é que se pode determinar se uma determinada classe ou objeto implementa uma interface específica?

sobes.tech IA

Resposta da IA

Em Go, as interfaces são implementadas de forma implícita: se um tipo implementar todos os métodos de uma interface, ele é automaticamente considerado como implementando essa interface.

Para verificar se um tipo específico implementa uma interface, pode-se usar uma afirmação de tipo ou tentar atribuir um valor desse tipo a uma variável de tipo interface.

Exemplo:

package main
import "fmt"

type Reader interface {
    Read(p []byte) (n int, err error)
}

type MyReader struct {}

func (r MyReader) Read(p []byte) (n int, err error) {
    return 0, nil
}

func main() {
    var r Reader
    var mr MyReader

    // Verificação de implementação de interface por atribuição
    r = mr // se MyReader não implementar Reader, ocorrerá erro de compilação

    // Verificação por afirmação de tipo
    if _, ok := interface{}(mr).(Reader); ok {
        fmt.Println("MyReader implementa a interface Reader")
    } else {
        fmt.Println("MyReader não implementa a interface Reader")
    }
}

Dessa forma, o compilador Go garante a conformidade com a interface, e em tempo de execução pode-se verificar usando uma afirmação de tipo.