Go语言结构体详解:定义、标签与JSON转换实战

Jasper
Jasper
发布时间:2026-10-13 | 2人浏览过
原创

深入讲解Go语言结构体的使用细节,包括字段命名规则、嵌入字段的继承机制以及利用标签实现JSON转换和数据库自动迁移的高级用法。

前言

结构体是Go语言中用于组合多种数据类型的重要工具。它包含一系列被命名的元素(即字段),每个字段拥有独立的名称和类型。在实际开发中,结构体常用于定义与数据库交互的数据模型(Model)或处理JSON数据交换。任何需要组合不同数据结构场景下,均可选择结构体作为载体。

基础声明与定义

通过type关键字定义结构体,字段名需遵循可见性规则。以下是一个待办事项模型的典型定义:

type Todo struct {
    ID        uint `gorm:"primarykey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt gorm.DeletedAt `gorm:"index"`
    Title     string
    Detail    string `gorm:"column:todo_detail;comment:待办详情"`
    Done      bool   `gorm:"default:false"`
}

上述结构体定义了包括无符号整数、时间类型、布尔值等混合类型的字段。当使用db.AutoMigrate(&Todo{})进行数据库表自动迁移时,GORM会根据标签生成相应的SQL建表语句:

CREATE TABLE `todos` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  ...
  `title` longtext,
  `todo_detail` longtext COMMENT '待办详情',
  `done` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_todos_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

可导出的标识符

Go语言通过标识符首字母的大小写来控制访问权限。只有满足以下条件的标识符才是可导出的(Exported),允许跨包访问:

  • 标识符名称以Unicode大写字母开头。
  • 标识符在包级作用域声明,或是结构体的字段名/方法名。

反之,小写字母开头的字段仅对当前包可见。这一特性常被用于控制JSON序列化的输出内容,未导出的字段在序列化时会被自动忽略。

JSON序列化与反序列化

结构体转JSON

使用encoding/json包中的Marshal函数可将结构体转换为JSON字节流。字段在JSON中的键名可以通过结构体标签(Struct Tag)进行定制。

type Novel struct {
    ID       uint `json:"novel_id"`
    Title    string
    Chapters []string `json:"novel_chapters,omitempty"`
}

常用标签选项包括:

  • omitempty:若字段为空值(如零值、nil指针、空切片等),则在JSON中省略该字段。
  • -:强制忽略该字段,不进行序列化。
  • json:"custom_name":指定JSON输出的键名。

示例:Title字段带有"-"标签,将不会出现在生成的JSON中;而ID字段使用自定义键名"novel_id"。

JSON转结构体

使用Unmarshal函数将JSON数据解析并填充至结构体实例中:

var novel Novel
err := json.Unmarshal([]byte(jsonData), &novel)

反序列化时,JSON键名将匹配结构体中的字段名或标签指定的名称,自动完成类型转换赋值。

嵌入字段与方法提升

嵌入字段(Embedding Fields)允许在一个结构体内直接声明类型而非具体字段名,从而实现类似继承的效果。

type Common struct {
    ID          uint
    CreatedTime time.Time
}

type Novel struct {
    Common
    Title string
}

嵌入字段的字段和方法被称为“提升”(Promoted)。在外部使用时,可以直接通过外层结构体实例访问内层字段(如novel.ID),但在复合字面量初始化时,必须显式指定内层结构体变量,不能直接将ID当作Novel的直接字段赋值。

对于方法集的提升:

  • 若嵌入非指针类型T,则S和*S均获得T的方法。
  • 若嵌入指针类型*T,则方法集规则更为灵活,但需注意避免循环依赖。

实践操作步骤

第1步:创建项目目录与初始化模块

建立工作空间并初始化Go模块,生成go.mod文件以管理依赖:

  1. 执行命令创建目录并进入:
    $ mkdir practice && cd practice
  2. 初始化模块名为practice:
    $ go mod init practice

第2步:安装必要的库

若使用GORM操作数据库或测试代码,需安装相关驱动:

  1. 导入并使用关键库:
    go get gorm.io/gorm
    go get gorm.io/driver/mysql
  2. 更新依赖列表:
    $ go mod tidy

第3步:编写运行代码

在项目中创建main.go文件,编写结构体定义及主函数逻辑,并通过以下命令编译运行:

  1. 保存代码至main.go。
  2. 在当前目录执行:
    $ go run .

总结

掌握结构体的定义规则、可见性控制及标签应用是进行Go语言后端开发的基础。合理利用嵌入字段可以显著减少重复代码,而精通JSON标签配置则能高效应对前后端数据交互。以上就是Go语言学习教程之结构体的示例详解的详细内容,更多关于Go语言 结构体的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表