首页 > 后端开发 > Golang > 如何区分 Go 结构中的默认值和显式设置零值?

如何区分 Go 结构中的默认值和显式设置零值?

Mary-Kate Olsen
发布: 2024-12-03 16:03:12
原创
229 人浏览过

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,我们无法判断另一个字段是否已设置或仍然具有默认值value:

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 结构中的默认值和显式设置零值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板