Go에서 인터페이스는 이름, 인수 및 반환 값을 포함하여 메서드의 구조를 지정합니다. 구조체가 인터페이스를 구현할 때 인터페이스에서 지정한 메서드 서명을 엄격하게 준수해야 합니다.
구조체 D와 해당 메서드 Connect가 인터페이스 B 구현에 실패한 예를 생각해 보세요. 반환 값 불일치:
type A interface { Close() } type B interface { Connect() (A, error) } type C struct { } func (c *C) Close() { } type D struct { } func (d *D) Connect() (*C, error) { // Mismatched function signature compared to interface B's Connect method c := new(C) return c, nil }
이 경우 D의 Connect는 C에 대한 포인터와 오류를 반환하지만 인터페이스 B는 Connect가 A 및 오류의 구현을 반환할 것으로 예상합니다. 오류. 따라서 오류에는 구조체 D가 인터페이스 B를 구현하지 않는다는 내용이 나와 있어 메서드 시그니처 간 정렬의 중요성이 강조됩니다.
cannot use d (type *D) as type B in argument to test: *D does not implement B (wrong type for Connect method) have Connect() (*C, error) want Connect() (A, error)
이 문제를 해결하려면 구조체 구현의 메서드 시그니처가 일치하는지 확인하세요. 인터페이스의 메소드 선언. 이 시나리오에서는 B 인터페이스를 준수하도록 D의 Connect 메서드를 수정해야 합니다.
func (d *D) Connect() (A, error) { c := new(C) return c, nil }
반대로 구조체 구현의 메서드 서명이 인터페이스와 다르면 구조체는 다음을 구현하지 않습니다. 인터페이스.
type Equaler interface { Equal(Equaler) bool } type T int func (t T) Equal(u T) bool { // Argument type mismatch return t == u } // does not satisfy Equaler
이 예에서 Equal의 인수 유형은 인터페이스를 구현하기 위해 다른 유형인 T 대신 Equaler 인터페이스 유형과 일치해야 합니다. 맞습니다.
위 내용은 내 Go 구조체가 인터페이스를 구현하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!