Map AND Struct

概述

参考:

Map(映射)

map 是 key-value pairs(键值对) 的无序集合。这种结构也称 关联数组(associative array)、字典(dictionary)、散列表/哈希表(hash table)。这是一种快速寻找值的理想结构:给定 Key,对应的 Value 可以迅速定位。

map 的声明

var MapID map[KeyType]ValueType

map 的实例化

MapID = make(map[KeyType]ValueType)

赋值

MapID[KEY] = VAL

实例化的同时进行赋值

MapID := map[KeyType]ValType{
    KEY_1:VAL_1,
    KEY_2:VAL_2,
    ...,
    KEY_n:VAL_n
}

这相当于:

MapID := make(map[KeyType]ValueType)
MapID["KEY_1"] = "VALUE_1"
MapID["KEY_2"] = "VALUE_2"

map 的引用

下面是引用 map 中指定 KEY 的 VALUE 的方法:

MapID[KEY]

引用 map 的长度

map 的长度指的是键值对的个数,有几个键值对,长度就是几

len(MapID)

引用 map 中某个 Key 的 Value

MapID["KEY"]

Key/Value 的删除

MapID["KEY"]

删除 MapID 这个 map 的 KEY 以及对应的 VAL

Struct(结构体)

Struct(结构体) 是一种复合Data type(数据类型),Struct 可以看作是一个自定义的 Data type,由一系列的 Fields(字段,有的地方也称为属性) 组成,每个字段通常都包含 名称类型。Struct 把数据聚集在一起,然后访问这些数据的时候,好像这些数据是一个独立实体的一部分。Struct 也是值类型,可以通过 * new() 函数创建。

组成结构体的属性分两部分:

  • FieldName(字段名称) # 字段的名称
  • BaseType(基础类型) # 基础类型可以是另一个结构体,表示该结构体包含另一个结构体

每个字段都有其对应的基础数据类型,在一个结构体中,FIELD 名字必须是唯一的。代码示例:struct.go

Struct 的定义

type StructID struct {
    Name1 BaseType1 ["TAG"]
    Name2 BaseType2 [`TAG`]
    ...
}

// 也可以使用简单的方法定义一个结构体:
// 这个结构体中,两个属性的类型都是 int
type T struct {a, b int}

Struct 的声明

var StructVarID StructID

Struct 的实例化

StructVarID := new(StructID)

Struct 的引用

结构体中属性的引用 结构体名,中间跟一个点,再接该结构体内的字段名。即可引用该结构体中的某个字段

StrcutID.FIELD1

在 Go 语言中,这个 . 点符号叫做 Selector(选择器)。无论定义的变量是一个结构体类型还是一个结构体类型指针,都是用同样的 selector-notation(选择器符) 来引用结构体的字段。

TAG

除了 FIeld 和 BaseType 之外,还可以给该属性添加 TAG(标签),TAG 使用 双引号 或者 重音号 来表示。这些 TAG 能被用来做文档或者重要的标签(比如在使用 JSON、YAML 等解析时,这些解析库会读取 TAG 中的内容,将结构体中的每个属性对应到 json 或 yaml 的字段上)。

TAG 里面的内容在正常编程中没有作用。一般在 Reflect(反射)、某些第三方库(比如 gin 的数据绑定功能)、等等地方可以起到关键的作用。Strcut 中的 Tag 在通常的编程中无法使用,只有 reflect 包中的方法可以获取这些 Tag 的信息

Struct 常见用法

在日常使用中,我们常常自己定义一个 函数,用于初始化一个接口体

func NewStructID() *StructID {
	return &StructID(
		FIELED1: XXXX
		FIELED2: XXXX
		......
	)
}

然后直接调用该方法即可,使用方式其实与 new() 函数一样

func main() {
	StructVar := NewStructID
}

最佳实践

将一个结构体中的值拷贝到另一个相似的结构体中

参考:

使用 jinzhu/copier 项目即可轻松得将一个结构体中的值复制到另一个结构体中


最后修改 July 30, 2024: clearup (896f81c1)