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