Gorm 模型声明中 string 和 *string 的区别

Raj*_*han 0 go go-gorm

gorm https://gorm.io/docs/models.html的文档在下面提供了一个示例。
字段NameEmailstring和描述*string。这里的主要区别是什么?
另外如何为存储图像链接列表的图像字段提供数据类型?
应该是[]string还是[]*string

type User struct {
  ID           uint
  Name         string
  Email        *string
  Images       []string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
  CreatedAt    time.Time
  UpdatedAt    time.Time
}
Run Code Online (Sandbox Code Playgroud)

小智 5

主要区别在于,如果使用指针,则可以将空值放入数据库中,否则必须放入字符串。本质上,如果数据库字段可为空,则应该使用指针。


nip*_*una 5

Go 对每个原始数据类型都有默认值。

int -> 0, string -> "", bool -> false 同样。所以如果你需要添加空值,或者将空值加载到一个变量中,它应该是一个指针。否则默认。

Go 中指针的默认值为 nil。

而复杂的数据类型,如切片、地图,则保留引用。所以它们的默认值为 nil。所以,Images []string这里的图像可以为零。

下面带有指针类型User1和不带指针类型的代码User2显示了默认值的差异。

package main

import (
    "fmt"
    "time"
)

type User1 struct {
    Email        *string
    Images       []string
    Birthday     *time.Time
}

type User2 struct {
    Email        string
    Images       []string
    Birthday     time.Time
}

func main() {
    user1 := User1{}
    user2 := User2{}

    fmt.Printf("user1 := %+v \n", user1)
    //Output : user1 := {Email:<nil> Images:[] Birthday:<nil>}
    fmt.Printf("user2 := %+v \n", user2)
    //Output : user2 := {Email: Images:[] Birthday:0001-01-01 00:00:00 +0000 UTC}
}
Run Code Online (Sandbox Code Playgroud)