> 백엔드 개발 > Golang > 유형 불일치를 피하기 위해 Go 구조체 메소드는 인터페이스 정의와 어떻게 일치해야 합니까?

유형 불일치를 피하기 위해 Go 구조체 메소드는 인터페이스 정의와 어떻게 일치해야 합니까?

Susan Sarandon
풀어 주다: 2024-12-15 02:16:13
원래의
871명이 탐색했습니다.

How Do Go Struct Methods Need to Match Interface Definitions to Avoid Type Mismatches?

구조체 메소드에 대한 인터페이스 구현 제한

Go에서 구조체는 동일한 이름의 메소드가 있는 경우에만 인터페이스를 구현할 수 있습니다. 유형 및 서명을 인터페이스 방법으로 사용합니다. 다음 코드를 고려하십시오.

package main

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) { return &C{}, nil } // Return type mismatch

func test(b B) {}

func main() {
    d := &D{}
    test(d) // Error: type mismatch for Connect() method
}
로그인 후 복사

여기서 오류 메시지는 다음과 같습니다. "테스트할 인수에서 d(D 유형)를 유형 B로 사용할 수 없습니다. D는 구현하지 않습니다. B(Connect 방법 유형이 잘못됨)". 이는 D의 Connect 메소드의 반환 유형이 *C이기 때문에 발생하며 이는 B 인터페이스에서 지정한 (A, 오류) 반환 유형과 일치하지 않습니다.

따라서 구조체의 메소드가 매개 변수 또는 반환 값이 다른 경우 해당 인터페이스 메소드에서 유형을 입력하면 구조체가 인터페이스를 구현하지 않습니다.

문제

이 문제를 해결하려면 구조체 D의 Connect 메서드가 인터페이스 B의 Connect 메서드와 정렬되어야 합니다. 여기에는 예상된 (A, 오류) 유형을 반환하는지 확인하는 것이 포함됩니다.

import "fmt"

type A interface {
    Close()
}

type B interface {
    Connect() (A, error)
}

type C struct {
    name string
}

func (c *C) Close() {
    fmt.Println("C closed")
}

type D struct {}

func (d *D) Connect() (A, error) {
    return &C{"D"}, nil
}

func test(b B) {
    b.Connect().Close() // Call Close() on the returned A
}

func main() {
    test(&D{})
}
로그인 후 복사

이 수정을 통해 코드는 오류 없이 컴파일되고 실행됩니다. 이제 구조체 D의 Connect 메서드가 B 인터페이스 정의를 준수하기 때문입니다.

위 내용은 유형 불일치를 피하기 위해 Go 구조체 메소드는 인터페이스 정의와 어떻게 일치해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿