>백엔드 개발 >Golang >내 Go 구조체가 인터페이스를 구현하지 않는 이유는 무엇입니까?

내 Go 구조체가 인터페이스를 구현하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-06 22:39:12411검색

Why Doesn't My Go Struct Implement the Interface?

인터페이스 구현에는 일치하는 메서드 서명이 필요합니다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.