Gorm 模型声明中 string 和 *string 的区别
Difference in string and *string in Gorm model declaration
gorm 的文档 https://gorm.io/docs/models.html 下面给出了一个例子。
字段 Name
和 Email
用 string
和 *string
描述。
这里的主要区别是什么?
另外如何为存储图像列表的图像字段提供数据类型 link?
应该是 []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 对每个原始数据类型都有默认值。
int -> 0, string -> "", bool -> false 同样。所以如果你需要添加空值,或者加载空值到一个变量,它应该是一个指针。否则默认。
Go 中指针的默认值为 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}
}
gorm 的文档 https://gorm.io/docs/models.html 下面给出了一个例子。
字段 Name
和 Email
用 string
和 *string
描述。
这里的主要区别是什么?
另外如何为存储图像列表的图像字段提供数据类型 link?
应该是 []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 对每个原始数据类型都有默认值。
int -> 0, string -> "", bool -> false 同样。所以如果你需要添加空值,或者加载空值到一个变量,它应该是一个指针。否则默认。
Go 中指针的默认值为 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}
}