1 Go的枚举

1.1 定义常数实现枚举

◆ 类型别名的形式来声明类型
◆ iota来自增和自动赋值
Go实战抢红包系统(四) - 基础实施层coding_Go语言
显然输出为2
Go实战抢红包系统(四) - 基础实施层coding_Go语言_02
这样亦可.

1.2 何时可用iota ,何时又不可用iota呢?

◆ 无状态且非持久化,可以使用iota
◆ 有状态或者需要持久化,不能使用iota

1.3 显式iota定义

Go实战抢红包系统(四) - 基础实施层coding_Go语言_03

定义好之后,值不可再改变!

2 在Go中如何使用JSON

2.1 标准库内建的JSON包

Go实战抢红包系统(四) - 基础实施层coding_Go语言_04
Go实战抢红包系统(四) - 基础实施层coding_Go语言_05
默认使用的JSON字段名称是它的Field名称

2.2 并非任何类型都可序列化

◆ 支持string、 bool、 数字类型、数组和切片、结构体、map
◆ Channel、complex、 function 类型无法进行json序列化
◆ 结构体中的循环数据结构,序列化时不会被处理

2.3 结构体中自定义字段名称

◆ JSON tag key : name,[omitempty,-]
◆ [string]标记 , 定义bool,浮点,整数类型使用字符串编码
◆ 临时添加字段:内嵌结构体,合并多个结构体

2.3.1 序列化演示

  • demo代码-json.go
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_06

  • 运行结果
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_07

  • 对name进行自定义
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_08

  • 可以发现age无法实现序列化导出,将其改为大写即可
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_09

  • 其中的omitempty可以过滤空值(包括0),于是结果中不再包含age信息
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_10

  • 有-不会序列化
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_11

  • 去除-即可
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_12

  • 整型加上string会以字符串形式序列化
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_13

2.3.2 反序列化演示

Go实战抢红包系统(四) - 基础实施层coding_Go语言_14

  • 无法序列化id,所以要求json一定要与结构体中数据类型保持一致
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_15

2.4 高性能JSON库 - jsoniter [json-iterator]

◆ 快,并且更快
◆ 支持java和go
◆ 百分百兼容JSON标准库, 一行代码迁移到jsoniter
◆ 安装: go get github.com/json-iterator/go

3 config 配置

3.1 分类标准

内容

静态和动态

环境

开发、测试、灰度、生产

形式

本地文件和分布式服务

格式

ini > properties > yaml > toml > xml > json(推荐度排序)

用途 - 程序/应用级别

◆ 配置文件命名规范
前缀+[-_ ]+功能

◆ 程序级别
可以不分组,比如: boot.ini,config.ini

◆ 应用级别分组
比如app-mysql.properties

环境来变量化配置项

◆ 不同环境使用不同的配置文件
◆ 变量化因环境不同的可变配置项

3.2 统一配置工具库 - props 设计

◆ 各种配置源抽象或转换为key/value结构

◆ 支持prop,ini,zk,consul.etcd,nacos

◆ 支持unmarshal

◆ props配置客户端工具库加持+ INI格式

◆ INI文件由节、键、值组成

◆ INI格式三要素 :节、参数(key/value)、注释

◆ section :方括号包围,比如: [mysql]

◆ 参数: key=value ,有些工具支持冒号分割

◆ 注释,使用;,有些编辑器和工具支持#

◆ Section作为分组

◆ props配置客户端使用完整的key来解释

◆ 完整的key由Section和参数key组成 , .分割
Go实战抢红包系统(四) - 基础实施层coding_Go语言_16

4 基础资源层-配置设计-starter编码
  • config.ini
    Go实战抢红包系统(四) - 基础实施层coding_Go语言_17

Go实战抢红包系统(四) - 基础实施层coding_Go语言_18

参考

golang中struct转json后键名首字母大小写问题解决
GO从0到1实战微服务版抢红包系统