Sobes.tech
Junior — Middle

Come si può determinare se una classe o un oggetto specifico implementa un'interfaccia particolare?

sobes.tech AI

Risposta dell'AI

In Go, le interfacce vengono implementate in modo implicito: se un tipo implementa tutti i metodi di un'interfaccia, viene automaticamente considerato come implementante quell'interfaccia.

Per verificare se un tipo specifico implementa un'interfaccia, si può usare un'asserzione di tipo o tentare di assegnare un valore di quel tipo a una variabile di tipo interfaccia.

Esempio:

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 dell'implementazione dell'interfaccia tramite assegnazione
    r = mr // se MyReader non implementa Reader, ci sarà un errore di compilazione

    // Verifica tramite asserzione di tipo
    if _, ok := interface{}(mr).(Reader); ok {
        fmt.Println("MyReader implementa l'interfaccia Reader")
    } else {
        fmt.Println("MyReader non implementa l'interfaccia Reader")
    }
}

In questo modo, il compilatore Go garantisce la conformità all'interfaccia, e a runtime si può verificare tramite un'asserzione di tipo.