Sobes.tech
Junior — Middle

Jak lze určit, zda konkrétní třída nebo objekt implementuje určitý rozhraní?

sobes.tech AI

Odpověď od AI

V Go jsou rozhraní implementována nepřímo: pokud typ implementuje všechny metody rozhraní, je automaticky považován za implementující toto rozhraní.

Chcete-li zkontrolovat, zda konkrétní typ implementuje rozhraní, můžete použít tvrzení typu (type assertion) nebo se pokusit přiřadit hodnotu tohoto typu do proměnné typu rozhraní.

Příklad:

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

    // Kontrola implementace rozhraní přiřazením
    r = mr // pokud MyReader neimplementuje Reader, dojde k chybě kompilace

    // Kontrola tvrzením typu
    if _, ok := interface{}(mr).(Reader); ok {
        fmt.Println("MyReader implementuje rozhraní Reader")
    } else {
        fmt.Println("MyReader neimplementuje rozhraní Reader")
    }
}

Tímto způsobem zaručuje překladač Go shodu s rozhraním a při běhu lze kontrolovat pomocí tvrzení typu.