这篇文章比较详细的介绍了go语言中的map和结构体,已经介绍了他们的常用方法。
map
map是一种以key-value存储的数据类型,其中key只能是基本数据类型
声明
var m map[string]string 声明一个名为m的map类型,其键、值都为string类型
初始化
map需要用make来初始化,如下面代码所示,选择了初始容量为2,如果省略第二个参数,则会自动扩容
m = make(map[string]string, 2)
插入键值对
比如下面的表达方式
m["name"] = "zhangsan"
第二种创建方式
map也和其他的数据类型一样可以创建的同时赋值
m1 := map[string]string{
"age": "21",
}
如果不需要实例化可以以这种方式 m1 := map[string]string{}
查找
在map中以key-value的形式来进行查找,如果存在v返回value,ok返回true,如果不存在的话v返回空字符串,value返回false。
v, ok := m["name"]
if ok {
fmt.Println(v)
} else {
fmt.Println("not exist")
}
删除
map的删除使用delete(map名,key)来删除对应的键值对,如delete(m, "name")删除m的"name",如果不存在key,也不会报错。
遍历
map只有一种用for range的遍历方式,如下所示可以取到每一个m的key-value。
m = map[string]string{
"name": "lisi",
"age": "12",
"addr": "beijing",
}
for key, value := range m {
fmt.Println(key, value)
}
结构体
结构体是一组数据字段构成的数据类型
定义
结构体一般定义在main函数的外部,作为全局变量使用
type + 结构体的名字 + struct{}这样就定义了一个基本的结构体
一个结构体中可以有不同的字段,如下面的例子中,定义了一个名为student的结构体,有一个名为Name的string类型字段和一个名为Age的int类型字段。
type student struct {
Name string
Age int
}
实例化
结构体可以使用var来直接实例化,这种方式必须将字段一一对应。
var stu1 student = student{"张三", 15}
也可以用以下方式来实例化,这种方式在每行末尾要加上","字段的顺序可以打乱。如果不传属性该字段就是默认值。当然var也可以省略,用:=来快速实例化
var stu2 student = student{
Name: "李四",
Age: 16,
}
另外也可以用赋值的方式来实例化
var stu3 student
stu3.Name = "王五"
stu3.Age = 12
继承
比如有个叫做班长的结构体,他本身也是一个学生,加上了一个class的字段用来区别他是哪个班的班长,这样就可以到继承,如下面的例子所示。
type monitor struct {
student
class int
}
这个结构体就可以用这样的方式来定义
var stu4 monitor = monitor{
student:stu1,
class: "高三五班",
}
如果要取值的话,可以直接用stu4.name来得到stu4的name属性,当然也可以用stu4.student.name来获取
结构体方法
结构体方法和函数很像,printName为方法名,stu为形参,当然也可以传入参数已经得到返回值,这些都和函数类似。
func (stu student) printName() {
fmt.Println(stu.Name)
}
最后我们就可以用stu4.printName()来调用方法,打印stu4的Name属性。
结构体指针
可以在指针前面加一个*来获得结构体的地址,这样就可以修改结构体的属性的值,像下面的例子,就可以修改student结构体的name字段。在这种情况下结构体方法中的*可以省略,写成这种形式stu.Name = name。
func (stu *student) setname(name string) {
(*stu).Name = name
}
stu1.setname("小张")
fmt.Println(stu1)
结构体标签
在 Go 语言中,结构体标签是一种用于为结构体字段添加元数据的机制。结构体标签是一个字符串,它可以在结构体定义的字段后面用反引号包裹起来,例如:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
在这个例子中,Name 和 Age 字段都有一个 json 标签,它们的值分别为 "name" 和 "age"。这个标签的作用是告诉编码和解码 JSON 数据的库,如何将结构体字段映射到 JSON 对象的键。
结构体标签的格式是 key:"value",其中 key 表示标签的键,value 表示标签的值。结构体标签可以包含多个键值对,它们之间用空格分隔。在 Go 语言中,标签的解析是通过反射实现的,因此结构体标签可以用于很多场景,例如序列化和反序列化、ORM 映射、表单验证等。