英文:
How to distinguish between default value and inputed/changed
问题
我有一个结构体:
package main
type Test struct {
FieldInt int
FieldBool bool
FieldString string
}
func main() {
test := Test{}
...
}
这个结构体的默认值是:
- FieldInt: 0
- FieldBool: false
- FieldString: ""
例如,用户可以更改FieldInt
。它可以是正数、负数或0。
我想要检查用户是否更改了它(但是他/她可以设置为0):
if (test.FieldInt被更改) {
// 做一些操作
}
但是如果用户输入了0,我无法区分默认值和输入/更改后的值。
如何区分默认值和输入/更改后的值?
英文:
I have a struct:
package main
type Test struct {
FieldInt int
FieldBool bool
FieldString string
}
func main() {
test := Test{}
...
}
Default values of this struct is:
- FieldInt: 0
- FieldBool: false
- FieldString: ""
For example, a user can change FieldInt
. It can be a positive, negative number and 0.
And I want to check, that the user changed it (but he/she can set 0):
if(test.FieldInt was changed) {
// do something
}
But if the user inputted 0 then I can't distinguish between default value and inputted/changed one.
How to distinguish between default value and inputted/changed one?
答案1
得分: 6
一种常见的区分零值和未设置值的方法是使用指针:
type Test struct {
FieldInt *int
FieldBool *bool
FieldString *string
}
然而,并不是每种情况下都适用这种解决方案。由于您没有告诉我们您的具体情况,所以我只是提供这个作为可能的解决方案之一。
英文:
One common way to distinguish between the zero value and an unset value is with pointers:
type Test struct {
FieldInt *int
FieldBool *bool
FieldString *string
}
This won't be an appropriate solution for every situation, though, but since you haven't told us your precise situation, I offer this simply as one possible solution.
答案2
得分: 1
我个人倾向于Flimzy在这里提供的解决方案,因为它很简单。但是为了提供替代选项,你可以为每个属性添加一个标志,指示它是否已更新。
type Test struct {
FieldInt int
FieldBool bool
FieldString string
intUpdated bool
boolUpdated bool
stringUpdate bool
// 由于这是用于管理状态的内部属性,我们不导出这些属性
}
对我来说,在Go代码中看到这样的东西相当奇怪,但在JS UI应用程序中,这是非常常见的(几乎所有现代应用程序都有“存储”,用于监视UI的状态,并通常具有指示UI中的值是否与存储中的值不同的标志)。对于后端系统,通常会有更多的开销,例如,很常见的是为存储最后更新时间和更新者的用户名而添加字段。实际上,在后端服务的数据存储中,这可能是常态。
英文:
I would personally tend towards the solution Flimzy provided here for it's simplicity. But just to provide alternative options, you could add a flag for each property to indicate whether or not it's been updated.
type Test struct {
FieldInt int
FieldBool bool
FieldString string
intUpdated bool
boolUpdated bool
stringUpdate bool
// lets not export these though since it's for managing state
// internally and consumers of this object shouldn't modify these values
}
To me this is rather a strange thing to see in Go code, however it would be very common place in JS UI apps (almost all modern apps have 'stores' which monitor the state of the UI and typically have flags to indicate whether a value in the UI has changed from what's in the store or not). For back end systems, you usually see even MORE overhead to go with this, for example it would be very common to have fields to store the last time of update and the name of the user who updated it. In fact, that is probably the norm within the data stores for back end services.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论