>백엔드 개발 >Golang >Go 구조체에서 기본값과 명시적으로 설정된 0 값을 어떻게 구별할 수 있나요?

Go 구조체에서 기본값과 명시적으로 설정된 0 값을 어떻게 구별할 수 있나요?

DDD
DDD원래의
2024-12-04 17:20:15975검색

How Can I Differentiate Between Default and Explicitly Set Zero Values in Go Structs?

Go의 기본값 및 초기화되지 않은 필드 구별

Go에서는 기본 유형에 기본값이 있습니다. 예를 들어 정수(int)는 0으로 초기화됩니다. 그러나 구조체로 작업할 때 0 값과 초기화되지 않은 필드를 구별하는 것이 어려울 수 있습니다.

예를 들어 아래 코드를 고려해보세요.

package main

import "log"

type test struct {
    testIntOne int
    testIntTwo int
}

func main() {
    s := test{testIntOne: 0}

    log.Println(s)
}

이 코드에서는 testIntOne과 testIntTwo가 모두 0입니다. 그러나 testIntOne은 명시적으로 0으로 설정되었으며 testIntTwo는 기본값으로 초기화되었습니다. 이러한 모호함은 어떤 필드가 명시적으로 설정되었는지 판단하는 데 혼란을 초래할 수 있습니다.

이 두 경우를 구별하는 것이 가능한가요?

아니요, Go는 여부를 추적하지 않습니다. 필드가 설정되었는지 여부. 따라서 0 값이 초기화의 결과인지 아니면 의도적인 할당의 결과인지 알 수 없습니다.

해결 방법

  • 포인터 사용: 포인터는 nil 0 값을 가지므로 포인터가 설정되었는지 여부를 검사하여 확인할 수 있습니다. nil.
type test struct {
    testIntOne *int
    testIntTwo *int
}
  • Setter 메서드 만들기: 필드 값을 설정하고 설정 여부를 추적하는 메서드를 만들 수 있습니다.
type test struct {
    testIntOne int
    testIntTwo bool // Tracks if testIntTwo has been set
}

func (t *test) SetTestIntTwo(val int) {
    t.testIntTwo = val
    t.isSetTestIntTwo = true
}

func main() {
    s := test{}
    s.SetTestIntTwo(0)
    fmt.Println(s.isSetTestIntTwo) // Output: true
}

위 내용은 Go 구조체에서 기본값과 명시적으로 설정된 0 값을 어떻게 구별할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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