5. map集合
map以散列表方式存储键值对集合
map中每个元素都是键值对
声明格式:
map [键的类型] 值的类型{key:value,key:value}
key是操作map的唯一标准可以通过key对map中元素进行增加/删除/修改/查看
key是唯一的,添加重 复的key会覆盖之前的元素.
map是 引用类型 (不是值类型,目前学到的引用类型就是切片和map),只声明时为空指针(nil)
map读写数据时并不是并发安全的,可以结合RWMutex保证并发安全(RWMutex在后面讲解)
fmt.Println(map01) // map[名称:单冰 年龄:123] map01["名称"]= "傻逼" fmt.Println(map01) // map[名称:傻逼 年龄:123]
a.【实例化map的方式】
使用make函数
ap01:= make(map[int]int)
可以在声明map时直接给map赋初始值.注意初始值在一行和在多行写时的语法区别
:= map[int]int{1:2,2:3}
map中元素键值对语法满足: key:value
key和value的类型必须和map[key]value类型严格对应
map01 := make(map[int]string) map02 := map[string]string{"年龄":"123","名称":"单冰"}
b.【操作map中的元素】
使用key判断,如果key不存在向map中新增数据,如果key存在会覆盖map中元素
Go语言标准库中提供了对map元素删除的函数,使用顶层delete()即可完成删除
如果key存在,执行删除元素
如果key不存在,map中内容不变,也不会有错误
map01 := map[int]int{1:1,2:2} delete(map01, 1)
查看map中key对应的value 如果有 返回对应value 如果没有 返回对应类型的默认值
value,ok := s[3] 返回俩值 一个是key对应value 一个是该key是否存在
func main() { map01 := make(map[int]int) a,b:=map01[3] fmt.Println(a,b) // 0 false }
c.【map作为参数传递】
同切片一样 都是引用传递,函数中对map的操作就是对原map的操作。
func main() { map01 := map[int]int{1:1,2:2} modify(map01) fmt.Println(map01) } func modify(m map[int]int) { m[3] = 3 m[4] = 4 }
6. 结构体
有时我们需要将不同类型的数据组合成一个有机的整体。
如:一个学生有学号/姓名/性别/年龄/地址等属性。
显然单独定义以上变量比较繁琐,数据不便于管理。
// 正常写法 var id int var name string var sex string var age int var addr string // 使用结构体表示法 type Student struct { id int name string sex string age int addr string }
结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。
每个数据称为结构体的成员。
注意:结构体的定义是在主函数的外面的。
a.【结构体定义与初始化】
定义:
type 结构体名 struct {
(结构体成员列表)
成员名 数据类型
}
定义结构体变量:
var 变量名 结构体名
type Student struct { id int name string sex string age int addr string function func(int2 int) string slice []int arr [4]int map01 map[int]int }
注意:
结构体名 大小写问题,见可见性部分。
初始化:
//1. 顺序初始化(每个成员必须初始化 且顺序要一致) var stu1 Student = Student{1,"xxx","男",1,"地球"} //2. 自动推导 和指定成员赋值 未赋值的成员为默认值 stu1 := Student{1,"xxx","男",1,"地球"} stu1 := Student{name: "xxx",id: 1} fmt.Println(stu1.name) // xxx
b.【结构体变量的定义与赋值】
var stu1 Student stu1.id = 1 stu1.name = "xxx"
注意:
结构体名默认指向的就是第一个成员的地址
var stu1 Student stu1.id = 1 stu1.name = "xxx" fmt.Printf("%p\n",&stu1) // 0xc00001e080 fmt.Printf("%p\n",&stu1.id) // 0xc00001e080 fmt.Printf("%p\n",&stu1.name) // 0xc0000dc008
- 类似于java中的 类 student类 可以有成员变量 也可以有成员方法 。
c.【结构体数组 与 切片 与 map】
type Student struct { id int age int } func main() { var stu01 Student var stu02 Student stu01.id=1 stu02.id=2 // 存放类型为结构体类型的数组、和 切片 var stuArr = [2]Student{ stu01, stu02, } fmt.Println(stuArr) var stuSli = []Student{ stu01, stu02, } fmt.Println(stuSli) var stuMap = map[int]Student{ 1:stu01, 2:stu02, } fmt.Println(stuMap) }
d.【结构体作为参数传递】
结构体作为函数参数传递的时候为值传递
type Student struct { id int age int } func main() { var stu01 Student = Student{1,19} test001(stu01) fmt.Println(stu01) // {1 19} } func test001(student Student) { student.age=333 }
e.【可见性】
Go语言对关键字的增加非常吝啬,其中没有private、 protected、 public这样的关键字。
要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母开头。