Gorm模型声明中string与*string的区别及切片类型选择疑问
GORM模型字段类型问题解答
1. string与*string的核心区别
两者差异主要体现在Go语义和GORM映射逻辑两个层面:
- Go语法层面:
string是值类型,默认零值为""(空字符串),无法区分「用户主动提交空值」和「用户未提交该字段」两种场景;*string是字符串指针类型,默认零值为nil,可以明确标识字段是否被赋值。 - GORM映射层面:
- 声明为
string的字段,生成表结构时默认加NOT NULL约束,写入空字符串时数据库存储'',永远不会出现NULL值 - 声明为
*string的字段,生成表结构时默认允许为NULL,当字段值为nil时数据库存NULL,指针非空时存储指针指向的字符串内容
- 声明为
如果你的业务需要区分「用户没填邮箱」和「用户填的邮箱是空字符串」,就选*string;如果要求邮箱必填,空字符串属于合法输入,就选string。
2. 图片链接列表的类型选择
绝大多数场景下选择[]string即可,原因如下:
- 切片本身的零值就是
nil,已经可以区分「用户从未上传过图片(切片为nil)」和「用户主动清空了所有图片(切片为长度0的空切片)」两种场景,不需要给切片元素额外加指针 - 合法的图片链接本身就是非空字符串,空字符串的链接没有业务存储价值,不需要用指针区分单个元素的赋值状态
[]*string会增加不必要的内存开销和判空逻辑,代码可读性更差,没有额外收益
只有当业务确实需要存储空字符串作为有效链接,且需要区分「该位置未上传图片」和「该位置的图片链接为空」的特殊场景下,才需要选择[]*string。
内容的提问来源于stack exchange,提问作者Rajan Chauhan
相关产品推荐
相关产品推荐

