笔记四、go语法(下) | 青训营

78 阅读4分钟

这篇文章比较详细的介绍了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"`
}

在这个例子中,NameAge 字段都有一个 json 标签,它们的值分别为 "name""age"。这个标签的作用是告诉编码和解码 JSON 数据的库,如何将结构体字段映射到 JSON 对象的键。

结构体标签的格式是 key:"value",其中 key 表示标签的键,value 表示标签的值。结构体标签可以包含多个键值对,它们之间用空格分隔。在 Go 语言中,标签的解析是通过反射实现的,因此结构体标签可以用于很多场景,例如序列化和反序列化、ORM 映射、表单验证等。