结构体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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 2

万一, 不同的客户需要返回不同的 id 呢。。

3周前 评论
Junwind (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
躺平大叔 @ 躺平社区
文章
136
粉丝
15
喜欢
102
收藏
59
排名:274
访问:3.5 万
私信
所有博文
社区赞助商