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) }
이 코드에서 Engineer 유형은 Person 및 TaxPayer 유형을 모두 포함합니다. , 해당 데이터의 형식을 지정하기 위한 자체 String() 메서드를 정의합니다. 그러나 Engineer 객체를 인스턴스화하고 fmt.Println(engineer)을 호출하면 출력이 예상과 다릅니다.
{name: John Doe, age: 35 3 Construction}
이 출력은 Engineer.String() 메서드가 호출되고 있음을 나타냅니다. TaxPayer.String() 메소드도 결과에 기여합니다. 이는 String() 메서드가 포함되면 Engineer 유형으로 승격되고 Person.String() 및 TaxPayer.String() 메서드 모두 호출 가능하기 때문입니다.
이를 명확히 하려면 다음을 고려하세요. 시나리오:
fmt.Println(engineer.String()) // Compile error: ambiguous selector engineer.String
이 경우 엔지니어에게 여러 승격된 String() 메서드가 있어 선택기가 모호해지기 때문에 컴파일러에서 오류가 발생합니다. 그러나 fmt.Println(engineer)은 컴파일러가 해당 필드를 기반으로 Engineer의 기본 형식을 자동으로 선택하기 때문에 성공합니다.
이 명백한 불일치의 이유는 fmt.Println() 함수가 본질적으로 문자열 변환을 위임하기 때문입니다. fmt 패키지에. fmt.Stringer 인터페이스(String() 메소드 정의)를 구현하는 값을 발견하면 해당 메소드를 호출하여 문자열 표현을 얻습니다.
이 예에서는 Person.String() 및 TaxPayer.String()이 존재하지만 둘 다 엔지니어로 승격되지 않으며 기본 형식이 사용됩니다. 그러나 fmt.Println(engineer.String())의 경우 컴파일러는 모호한 선택기를 발견하고 오류를 발생시킵니다.
결론적으로, 삽입된 유형은 여러 개일 때 예기치 않은 String() 메서드 동작으로 이어질 수 있습니다. 임베디드 유형은 이러한 메소드를 정의합니다. 잠재적인 혼란을 피하고 원하는 결과를 보장하려면 임베딩 및 메서드 승격 메커니즘을 이해하는 것이 중요합니다.
위 내용은 Go\의 `fmt.Println`이 임베디드 유형 및 여러 `String()` 메소드를 사용하여 예기치 않은 출력을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!