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.