>  기사  >  백엔드 개발  >  Go\의 `String()` 메서드는 내장된 유형 및 여러 승격된 메서드에서 어떻게 작동합니까?

Go\의 `String()` 메서드는 내장된 유형 및 여러 승격된 메서드에서 어떻게 작동합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-21 12:59:13784검색

How Does Go's `String()` Method Behave with Embedded Types and Multiple Promoted Methods?

내장된 Go 유형의 예상치 못한 String() 메서드 상호 작용

작업 시 Go에서 String() 메서드 동작의 미묘한 차이를 이해하는 것이 중요합니다. 임베디드 유형이 있습니다. 다음 코드 조각을 고려해보세요.

type Engineer struct {
    Person
    TaxPayer
    Specialization string
}

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age)
}

type TaxPayer struct {
    TaxBracket int
}

func (t TaxPayer) String() string {
    return fmt.Sprintf("%d", t.TaxBracket)
}

func main() {
    engineer := Engineer{
        Person: Person{
            Name: "John Doe",
            Age:  35,
        },
        TaxPayer: TaxPayer{3},
        Specialization: "Construction",
    }
    fmt.Println(engineer)
}

이 코드의 출력은 "이름: John Doe, 연령: 35 3 Construction"입니다. 처음에는 수수께끼인 이 동작은 삽입된 유형이 String() 메서드와 상호 작용하는 방식을 조사하여 설명할 수 있습니다.

내장 유형 승격

Go에서 삽입 유형은 다음을 허용합니다. 다른 유형의 필드 및 메소드 포함. 유형이 다른 유형을 포함하면 포함된 유형의 필드와 메소드가 포함 유형으로 승격되어 마치 포함 유형에 정의된 것처럼 작동합니다. 이 예에서 Engineer 유형은 Person 및 TaxPayer 유형을 모두 포함합니다.

메서드 선택

포함된 유형에서 String() 메서드가 호출되면 기본 동작 해당 이름을 가진 가장 얕은(가장 덜 중첩된) 방법을 선택하는 것입니다. 그러나 동일한 깊이에 승격된 String() 메서드가 여러 개 있으면 선택기 식이 잘못되어 컴파일 시간 오류가 발생합니다.

제공된 코드에서 Person 및 TaxPayer 유형 모두 String()을 갖습니다. 행동 양식. 따라서 Engineer.String()은 잘못된 선택자입니다. 결과적으로 Engineer 값을 인쇄할 때 String() 메서드가 직접 호출되지 않습니다.

fmt 패키지 문자열 생성

명시적인 String()이 없는 경우 구조체 유형에 대해 정의된 메소드를 사용하면 fmt 패키지는 필드 값 인쇄를 포함하는 기본 문자열 표현으로 대체됩니다. Engineer 구조체에서는 "name: John Doe, age: 35 3 Construction"이 출력됩니다.

메소드 제거의 효과

흥미롭게도 Person 중 하나를 제거합니다. .String() 또는 TaxPayer.String()은 모호성을 해결하여 나머지 String() 메서드를 문자열 생성에 사용할 수 있도록 합니다. 이는 임베디드 유형을 사용할 때 메소드 명명 규칙을 신중하게 고려하는 것의 중요성을 강조합니다.

결론

내장 유형에 대한 String() 메소드의 동작은 명확성의 필요성을 강조합니다. 방법을 정의할 때의 통찰력. 메서드 선택 및 승격 메커니즘을 이해함으로써 개발자는 모호한 선택기를 피하고 해당 유형의 일관된 문자열 표현을 보장할 수 있습니다.

위 내용은 Go\의 `String()` 메서드는 내장된 유형 및 여러 승격된 메서드에서 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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