> 백엔드 개발 > Golang > Go 구조체에서 기본 값과 명시적으로 0 값을 설정하는 방법을 구별하는 방법은 무엇입니까?

Go 구조체에서 기본 값과 명시적으로 0 값을 설정하는 방법을 구별하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-03 16:03:12
원래의
230명이 탐색했습니다.

How to Distinguish Between Default and Explicitly Set Zero Values in Go Structs?

Go의 기본 구조체 값

Go에서는 int와 같은 기본 유형에 기본값이 있습니다. int의 경우 이 기본값은 0입니다. 그러나 수동으로 설정된 값 0과 기본값을 구별하기 어려울 수 있습니다.

다음 구조체를 고려하세요.

type test struct {
    testIntOne int
    testIntTwo int
}
로그인 후 복사

한 필드가 0으로 설정된 구조체를 생성하면 다른 필드가 설정되어 있는지 또는 여전히 기본값이 있는지 알 수 없습니다. 값:

package main

import "log"

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

    log.Println(s)
}
로그인 후 복사

솔루션

포인터 사용

한 가지 해결책은 필드에 포인터를 사용하는 것입니다. 포인터는 nil 값을 가지므로 필드가 설정되어 있는지 확인할 수 있습니다.

type test struct {
    testIntOne *int
    testIntTwo *int
}

func main() {
    s := test{testIntOne: new(int)}

    log.Println(s.testIntOne != nil) // Output: true
    log.Println(s.testIntTwo != nil) // Output: false
}
로그인 후 복사

메서드 사용

또 다른 해결책은 다음과 같은 메서드를 만드는 것입니다. 필드를 설정하고 설정 여부를 추적합니다. 직접 액세스를 방지하려면 필드 자체를 내보내지 않아야 합니다.

type test struct {
    testIntOne int
    testIntTwo int

    oneSet, twoSet bool
}

func (t *test) SetOne(i int) {
    t.testIntOne, t.oneSet = i, true
}

func main() {
    s := test{}
    s.SetOne(0)

    log.Println(s.oneSet) // Output: true
    log.Println(s.twoSet) // Output: false
}
로그인 후 복사

위 내용은 Go 구조체에서 기본 값과 명시적으로 0 값을 설정하는 방법을 구별하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿