- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在处理一个优惠券表单,其中有一些可选字段。
简介:
所有表单字段值都以 JSON 格式接收并映射到 Golang 结构中。在结构中,我为每个字段添加了一个“omitempty”标志。因此只有那些具有适当值的表单值被映射,其余值如 0、""、false 将被结构忽略。
这是Golang的结构
type Coupon struct {
Id int `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Code string `json:"code,omitempty" bson:"code,omitempty"`
Description string `json:"description,omitempty" bson:"description,omitempty"`
Status bool `json:"status" bson:"status"`
MaxUsageLimit int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
SingleUsePerUser bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}
问题:
当我第一次保存这个表单时,适当的表单值被保存到 Mongodb 中。
现在我想更新那个表单,假设有一个复选框,它在保存数据时被选中。更新表单时,未选中复选框并提交表单以保存。现在,由于我在结构中应用了“omitempty”标志,所以它不会将空值映射到复选框字段。由于该值未映射到结构中,因此它不会保存到数据库中。
当用户第二次编辑表单时,它会看到与选中时相同的复选框。 (但实际上,应该将值更新到数据库中,并且复选框应该显示为未选中。)
我在 REST API 中使用相同的表单数据(JSON 格式)。在 API 中,在更新表单数据时,如果我只提到那些需要的值并且不传递我不想更新的值,那么 MongoDB 会用提供的所需值覆盖整个文档(即使这些值是也被覆盖,我不想更新也不想传入 API)。
要求:
以后我想把REST API暴露出来,所以我不希望这件事发生在那里。这就是为什么我不想从结构字段中删除“omitempty”标志。
在结构中使用 omitempty 标志时,是否有任何方法可以将空表单值或 API 数据字段保存到数据库?
谢谢!
最佳答案
bool
类型的值有 2 个可能的值:false
和 true
。并且您想使用 bool
字段“传达”3 种不同的状态,即不更新字段、将字段设置为 false
以及将字段设置为 真
。这显然是不可能的。
int
值也是一样:0
值不能表示 2 个不同的选择,即不更新字段并将其设置为 0
.
如果你想在标签值中保留 omitempty
选项,那么为了让它工作,你必须将字段更改为指针:
type Coupon struct {
Id *int `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Code string `json:"code,omitempty" bson:"code,omitempty"`
Description string `json:"description,omitempty" bson:"description,omitempty"`
Status *bool `json:"status" bson:"status"`
MaxUsageLimit *int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
SingleUsePerUser *bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}
它的工作方式是,如果指针为 nil
,它将被忽略(这是 “omitempty” 选项)。如果该字段是一个非nil
指针,它将被更新为指向的值。
例如,如果您想排除一个bool
字段,那么*bool
值应该/将是nil
。如果要将其设置/更新为 false
,则它必须是指向 false
值的指针。如果要将其设置/更新为 true
,它必须是指向 true
值的指针。
一般来说,任何类型的 zero value是可能的并且应该被计算在内,如果你将它设为指针,你只能处理“它是零值”和“它从输入中丢失”,并且 nil
的值指针将表示“从输入中丢失”的情况,而指向零值的非 nil
指针将表示“它是零值”的情况。所以在上面的示例中,如果 string
字段也可以采用空字符串值 (""
),那么您还必须使它们成为指针。
请注意,您也可以使用自定义编码和解码逻辑来实现此目的,但这比较麻烦,使用指针可以自动完成此操作。
关于json - 如何在 Golang 结构中使用 omitempty 标志更新 Mongodb 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158987/
我正在尝试运行这段代码,用随机数替换字符串中的一个字符: //Get the position between 0 and the length of the string-1 to insert
我有一个包含 3 个位置的数组,假设它的所有位置都是数字 5。 [5 5 5] 我怎样才能以保持 555 的方式将它传递给 var?就像这样。 n:= 555 最佳答案 与使用任何其他语言的方式相同:
我使用 go dep 工具版本 v0.4.1,现在当我运行 dep init 时它会按预期创建 2 个文件,当我打开 gopkg.lock 我发现例如以下内容 [[projects]] name
我正在制作学习联系申请。我有一个 NewContact()。 // Contact - defines the fields of an entire Contact type Contact str
我一直在尝试使用该模块: https://godoc.org/github.com/hirochachacha/go-smb2#RemoteFile.ReadAt 为了在 Windows 机器上对我的
我需要在 golang 中编译 golang 中的程序。有没有不使用 exec.Command("go","build") 的原生形式? 最佳答案 不幸的是,我认为使用 exec.Command 是利
编写输出有效 go 代码的 go 应用程序可能最好使用内置的“go”包及其一些子包(“go/ast”、“go/token”、“go/printer”、等)。 要创建字符串文字表达式,您需要创建一个 a
我正在尝试使用 Golang 和 gin 为我的 api 和前端编写代理。如果请求转到除“/api”之外的任何内容,我想代理到 svelte 服务器。如果出现“/api/something”,我想在
我偶然发现了这个博客:using go as a scripting language并尝试创建一个可用于运行 golang 脚本的自定义图像,即 FROM golang:1.15 RUN go ge
我刚开始接触golang,我需要从json字符串中获取数据。 {"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "di
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 3 年前。 Improve
我是 goland 的新手,试图在我的第一个项目中使用它。我注意到在 goland 中它没有显示通过容器引入的相同 golang SDK。 这是我的 Dockerfile: FROM golang:1
我正在试用 golang-neo4j-bolt-driver 包 github.com/johnnadratowski/golang-neo4j-bolt-driver 我已经导入了包并正在使用创建新
如果我安装了Go发行版软件包,则会在/usr/lib/golang/pkg中看到很多文件,在/usr/lib/golang/src中看到非常相似的文件集。这两组之间有什么关系? pkg是从src中的源
我发现 golang 上下文对于在客户端-服务器请求范围内取消服务器的处理很有用。 我可以使用 http.Request.WithContext 方法发出带有上下文的 http 请求,但是如果客户端不
我正在尝试将一个 golang 数组(还有 slice、struct 等)放置到 HTML 中,这样当从 golang gin web 框架返回 HTML 时,我可以在 HTML 元素内容中使用数组元
目前正在使用这个 ffmpeg 命令编辑视频 ffmpeg -i "video1.ts" -c:v libx264 -crf 20 -c:a aac -strict -2 "video1-fix.ts
我需要从 play.golang.org 链接读取 golang 代码并保存到 .go 文件。我想知道 play.golang.org 是否有任何公共(public) API 支持。我用谷歌搜索但没有
我第一次使用 IntelliJ 的最新 (2014-01-03) Golang 插件。 通常,我的终端工作流程是 go build && ./executable -args=1 所以我试图创建一个启
这个问题只是在构建之间随机出现,现在甚至我们的生产 repo,几个月都没有改变,在构建时也会出现这个问题。我已经坚持了一段时间。它不会发生在我们的本地机器上,只有在使用 dockerfile 时才会发
我是一名优秀的程序员,十分优秀!