【问题标题】:Difference in string and *string in Gorm model declarationGorm模型声明中string和*string的区别
【发布时间】:2021-07-30 18:40:55
【问题描述】:

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
}

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

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

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

    Go 中指针的默认值为 nil。

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

    下面带有指针类型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}
    }
    

    【讨论】:

    • 谢谢,尼普纳。感谢详细的答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 2013-11-06
      • 2012-11-19
      • 2011-10-03
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多