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

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

DDD
发布: 2024-12-04 17:20:15
原创
932 人浏览过

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 都为零。但是,testIntOne 已显式设置为 0,而 testIntTwo 已按默认值初始化。这种歧义可能会导致在确定哪些字段已显式设置时出现混乱。

是否可以区分这两种情况?

不,Go 不会跟踪是否某个字段已设置或未设置。因此,不可能知道零值是初始化的结果还是故意赋值的结果。

解决方法

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

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