首页 > 后端开发 > Golang > 我们如何区分 Go 中显式设置的结构体字段和默认初始化的结构体字段?

我们如何区分 Go 中显式设置的结构体字段和默认初始化的结构体字段?

Patricia Arquette
发布: 2024-12-18 15:00:18
原创
501 人浏览过

How Can We Distinguish Between Explicitly Set and Default-Initialized Struct Fields in Go?

结构体字段的默认值

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。使用指针

指针有一个空值nil,它不同于0。通过初始化指针字段,我们可以轻松检查它们是否已被设置。

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中文网其他相关文章!

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