구조체 필드의 기본값
Go는 데이터 유형에 따른 기본값으로 구조체 필드를 초기화합니다. 예를 들어 정수 필드는 0으로 초기화됩니다. 그러나 이 기본값은 때때로 유효한 값일 수 있으므로 명시적으로 설정되지 않은 필드와 기본적으로 초기화된 필드를 구별하기가 어렵습니다.
예:
type test struct { testIntOne int testIntTwo int } func main() { s := test{testIntOne: 0} // Initializes testIntOne to 0 // How can we determine whether testIntOne has been set explicitly or initialized to 0? }
구별 불능 값
안타깝게도 Go에는 초기화되지 않은 필드와 기본값으로 초기화된 필드를 구별하는 기본 제공 방법이 없습니다.
해결책:
이 문제를 해결하려면 몇 가지 대안을 고려하세요. 접근 방식:
1. 포인터 사용
포인터에는 0과 다른 null 값 nil이 있습니다. 포인터 필드를 초기화하면 포인터가 설정되었는지 쉽게 확인할 수 있습니다.
type test struct { testIntOne *int testIntTwo *int } func main() { s := test{testIntOne: new(int)} // new() возвращает указатель, инициализированный до нуля fmt.Println("testIntOne set:", s.testIntOne != nil) // Выведет true, так как testIntOne инициализирован fmt.Println("testIntTwo set:", s.testIntTwo != nil) // Выведет false, так как testIntTwo не инициализирован }
2. 메소드 사용
메소드를 사용하여 필드 초기화를 제어할 수도 있습니다. 이 경우 필드가 수동으로 초기화되었는지 여부를 나타내는 플래그가 설정되었는지 추적할 수 있습니다.
type test struct { testIntOne int testIntTwo int oneSet, twoSet bool // Флаги для отслеживания инициализации } func (t *test) SetOne(i int) { t.testIntOne, t.oneSet = i, true // Установка поля и флага } func (t *test) SetTwo(i int) { t.testIntTwo, t.twoSet = i, true // Установка поля и флага } func main() { s := test{} s.SetOne(0) // Вызов метода для инициализации fmt.Println("testIntOne set:", s.oneSet) // Выведет true fmt.Println("testIntTwo set:", s.twoSet) // Выведет false }
위 내용은 Go에서 명시적으로 설정된 구조체 필드와 기본 초기화 구조체 필드를 어떻게 구별할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!