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) }
이 코드가 실행되면 다음과 같은 출력이 생성됩니다.
{name: John Doe, age: 35 3 Construction}
Person 및 내장 유형 내에 여러 String() 메서드가 정의되어 있으므로 이 결과는 혼란스러워 보일 수 있습니다. 납세자. 그러나 모호성은 다음 규칙에 따라 해결됩니다.
Person.String() 메서드 또는 TaxPayer.String() 메서드를 제거하면 모호성이 해결되어 나머지 String() 메서드를 기본 형식 지정에 사용할 수 있습니다.
이 동작에서 중요한 점은 포함된 유형이 단일하고 명확한 메서드가 정의된 경우에만 String() 메서드를 승격한다는 것입니다. 여러 메서드가 존재하는 경우 포함 유형에는 승격된 String() 메서드가 없으며 기본 형식이 사용됩니다.
위 내용은 충돌하는 `String()` 메서드가 있는 유형을 포함할 때 Go의 `fmt.Println`이 예기치 않은 출력을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!