结构体Tag作用
结构体的tag是做什么的?
主要是针对字段的,我们的字段是由 字段名称+类型
组成,如下
type User struct {
Id int
// 其它字段
}
假如我们的程序中,已经按这种字段名写了很多逻辑了,某天客户端需要传一个User的json格式给他,他定好的protobuf中的Id字段是id
,那么我们返回时,就很被动了,如果将结构体中的Id
修改为id
,会影响很多地方,改动代价太高。
因此Tag的作用就解决了这种问题,我们可以在字段后面跟一个Tag:
type User struct {
Id int `json:"id"` // json格式化时,会按照id字段名称取
// 其它字段
}
data, _ := json.Marshal(user)
fmt.Printf("%s\n", data) // {"id":1} json中的是id,满足我们的需求了
数据库字段的属性设置
我们可以用gorm
tag,帮助我们实现数据库的自动处理,比如自动迁移,不同数据库之前的兼容等等。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 定义用户信息结构体
type User struct {
Id uint `gorm:"primary_key;auto_increment" json:"id"` // 定义了数据库字段属性,同时也定义了json中生效的字段名
Name string `gorm:"size:100" json:"name"`
Address string `gorm:"size:255" json:"address"`
Age int `gorm:"default:0" json:"age"`
}
func main() {
// 连接数据库
dsn := "root:123456@tcp(127.0.0.1:3306)/User?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接本地User库失败")
}
// 自动迁移
db.AutoMigrate(&User{}) // 会自动帮我们创建表,也就是执行下面的sql语句
/*CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`age` bigint(20) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;*/
// 新增一条数据
user := User{
Name: "junwind",
Age: 18,
Address: "hubei",
}
db.Create(&user)
fmt.Println("创建user成功", user)
// 根据id查询数据
var myUser User
db.First(&myUser, user.Id)
fmt.Printf("%v\n", myUser)
// 输出结果
//创建user成功 {12 junwind hubei 18}
//{12 junwind hubei 18}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: