>  기사  >  백엔드 개발  >  Go\의 `fmt.Println`이 임베디드 유형 및 여러 `String()` 메소드를 사용하여 예기치 않은 출력을 생성하는 이유는 무엇입니까?

Go\의 `fmt.Println`이 임베디드 유형 및 여러 `String()` 메소드를 사용하여 예기치 않은 출력을 생성하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-21 20:23:181000검색

Why Does Go's `fmt.Println` Produce Unexpected Output with Embedded Types and Multiple `String()` 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)
}

이 코드에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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