在Go中,我得到了类型的默认值。在这种情况下,将int初始化为0。
我有一个问题,其中对我来说int中的0可以是一个有效值,因此我需要检查它是由我设置还是被初始化。有什么办法可以告诉他们之间的区别吗?
考虑下面的代码
…我需要能够区分testIntOne
和之间的区别,testIntTwo
但是它们看起来一样!
package main
import "log"
type test struct {
testIntOne int
testIntTwo int
}
func main() {
s := test{testIntOne: 0}
log.Println(s)
}
您无法分辨出差异,无法跟踪是否设置了字段(或变量)。
您可以使用nil
值为零的指针,因此,如果未设置该指针,则可以知道:
type test struct {
testIntOne *int
testIntTwo *int
}
func main() {
s := test{testIntOne: new(int)}
fmt.Println("testIntOne set:", s.testIntOne != nil)
fmt.Println("testIntTwo set:", s.testIntTwo != nil)
}
输出(在Go Playground上尝试):
testIntOne set: true
testIntTwo set: false
当然new()
只能用于获得指向一个int
值的指针0
。
您还可以使用一种方法来设置字段,这可以帮助您额外跟踪“
isSet”属性。在这种情况下,您必须始终使用提供的方法来设置字段。最好是使字段不导出,这样其他人(包外部)将无法直接访问它们。
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)
fmt.Println("testIntTwo set:", s.twoSet)
}
输出(在Go Playground上尝试):
testIntOne set: true
testIntTwo set: false
问题内容: 以下问题有多种答案/技术: 如何为golang结构设置默认值? 如何在Golang中初始化结构 我有几个答案,但需要进一步讨论。 问题答案: 强制方法获取结构(构造方法)。 一个好的设计是使您的类型不导出,但提供一个类似NewMyType()的导出构造函数,您可以在其中正确初始化struct / type。还返回接口类型而不是具体类型,并且该接口应包含其他人希望对您的值进行的操作。当然
我想为 Go 中的结构字段分配默认值。我不确定这是否可能,但在创建/初始化结构的对象时,如果我不为字段分配任何值,我希望它从默认值分配。知道如何实现它吗?
以下问题有多种答案/技巧: 如何为golang结构设置默认值? 如何在 golang 中初始化结构 我有几个答案,但需要进一步讨论。
根据enable_if结构的定义: 我想知道怎么做 特别是: 在
问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数
问题内容: 不知何故,在下面的Node类中,and变量在Node的所有实例之间共享。 有什么办法可以让我继续使用构造函数参数的默认值(在这种情况下为空列表),但要同时获取它们和拥有其自身的变量以及变量? 我正在使用python 3.1.2。 问题答案: 可变的默认参数通常不会执行您想要的操作。相反,请尝试以下操作: