Junior — Middle
Jak można określić, czy dana klasa lub obiekt implementuje określony interfejs?
sobes.tech AI
Odpowiedź od AI
W Go interfejsy są implementowane niejawnie: jeśli typ implementuje wszystkie metody interfejsu, jest automatycznie uważany za implementujący ten interfejs.
Aby sprawdzić, czy konkretny typ implementuje interfejs, można użyć asercji typu lub spróbować przypisać wartość tego typu do zmiennej typu interfejsowego.
Przykład:
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
// Sprawdzenie implementacji interfejsu przez przypisanie
r = mr // jeśli MyReader nie implementuje Reader, wystąpi błąd kompilacji
// Sprawdzenie przez asercję typu
if _, ok := interface{}(mr).(Reader); ok {
fmt.Println("MyReader implementuje interfejs Reader")
} else {
fmt.Println("MyReader nie implementuje interfejsu Reader")
}
}
W ten sposób kompilator Go gwarantuje zgodność z interfejsem, a w czasie działania można to sprawdzić za pomocą asercji typu.