Gorm-如何在使用指针时访问可为null的字段



我是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")

相关内容

  • 没有找到相关文章

最新更新