我是Go新手,仍在学习可选结构字段。
我正在查看Gorm手册页面,其中给出了一个使用指针指示可为空字段的示例(此处(
如果我把给出的例子去掉,使它只包含一个强制性字段和一个可选字段,我会得到这样的东西:
https://play.golang.com/p/lOLGWNVvq1l:
package main
import "fmt"
type User struct {
Name string
Email *string
}
func main() {
user := User{Name: "Example"}
// cannot use "example@example.com" (untyped string constant) as *string value in assignment
user.Email = "example@example.com"
// invalid operation: user.Email == "example@example.com" (mismatched types *string and untyped string)
if user.Email == "example@example.com" {
fmt.Println("foo")
}
}
如何对刚从数据库中检索到的记录执行操作?
我需要能够检查一个可以为null的字段是否设置为某个值。我也不能给它赋值。
我想到的一种方法是使用某种包装函数来尝试使事情更安全,比如https://play.golang.com/p/4YlpPwaXMkm我有:
func UnwrapString(x *string) string {
if x != nil {
return *x
}
return ""
}
func WrapString(x string) *string {
return &x
}
func main() {
user := User{Name: "Example"}
// can safely set an optional value that is currently null
if UnwrapString(user.Email) == "example@example.com" {
fmt.Println("hello world")
}
// can safely set a value if the existing Email is null
user.Email = WrapString("example@example.com")
// only safe because the value is set
if *user.Email == "example@example.com" {
fmt.Println("hello world")
}
}
在Gorm中处理可为null的字段似乎是一件非常基本和常见的事情,我不希望自己动手做。戈尔姆做这件事的惯用方法是什么?
检查字段是否为非零的惯用方法,如果是,则比较值:
if user.Email != nil && *user.Email == "example@example.com" {
fmt.Println("foo")
}
这样做的原因,即使是用户。电子邮件为nil(并且您没有得到nil指针解引用恐慌(,这是因为Go具有短路求值,这意味着如果第一个比较在这个and语句中失败,则不会对第二个进行求值,因为如果第一个值已经为false,则这个and语句不可能为true。
要进行内联指针分配,您编写的函数也是我要做的:
func StrPtr(s string) *string {
return &s
}
然后你可以做:
user.Email = StrPtr("example@example.com")