map
map的基本介绍
map是 key-value数据结构,又称为字段或者是关联数组,类似其他编程语言的集合,在编程中经常被使用
map的声明
基本语法:
var 变量名 map[keytype]valuetype
-
golang中的map中的[key]可以是多种类型
通常为int、string -
slice\map\function不可以
-
valuetype的类型基本和keytype一样
通常为int\string\map
声明的举例
var a map[string]string
var a map[string]int
map hero map[string]map[string]string
一开始的时候map不会分配空间,必须要先用make分配空间
案例演示:
func main(){
heroes := make(map[string]string)
heroes["hero1"] : "宋江"
heroes["hero2"] : "武松"
fmt.Println(heroes)//第一种
//第二种
var a map[string]string
a = make(map[string]string,10)//这里的十是指的是个数,必要的时候要用append进行扩展
//第三种:
heroes := map[string]string{
"hero1" = "无用"
"hero2" = "林聪"
}
}
课堂演示:
//用key-value类型演示,存放1个学生的信息,每一个学生要有name还有sex信息
func main() {
var stud map[string]string
stud = map[string]string//stud := make(map[string]string)
stud["stu1"]["name"] = "jack"
stud["stu1"]["sex"] = "男"
}
map的增加和减少查找和删除
-
增加:key还没有,就是增加
-
减少:使用内置函数delete:delete(map变量名,“key”)
假如我们要删除map中所有的key,没有一个专门的方法一次删除,可以遍历一个key,一个一个删除
func main() {
var stud map[string]string
stud = map[string]string
stud["stu1"]["name"] = "jack"
stud["stu1"]["sex"] = "男"
for key,_ := range stud{
delete(stud,"key")
}//实现了删除
或者我们还可以直接重新定义
再次使用
stud = map[string]string//这样就实现了全部删除
- 查找:
案例演示:需要使用
val,findRex := stud["stu1"]
//其中需要说明的是val返回的是stud["stu1"]表示的值
//findRex返回的是一个bool型true或者是false,找到了就是true,没有找到就是false
if findRex {
fmt.Println(“有stu1的值 为%n”,val)
}else {
fmt.Println(“没有stu1的值 %n”)
}
对上面代码的说明:如果stud含有“stu1”就会返回一个true,否则就会返回一个true
map遍历
案例演示相对复杂的map遍历
使用的是for-range结构
var monsters map[string]map[string]string
monsters = make(map[string]map[string]string)
monsters["mon01"] = make(map[string]string)
monsters["mon01"]["name"] = "白骨精"
monsters["mon01"]["sex"] = "女"
monsters["mon01"]["age"] = "1000"
monsters["mon02"] = make(map[string]string)
monsters["mon02"]["name"] = "狮子王"
monsters["mon02"]["sex"] = "man"
monsters["mon02"]["age"] = "10085"
monsters["mon03"] = make(map[string]string)
monsters["mon03"]["name"] = "白蛇女"
monsters["mon03"]["sex"] = "女"
monsters["mon03"]["age"] = "1600"
fmt.Println(monsters)
//运用for - range进行遍历monsters
for k1,v1 := range monsters{
fmt.Println("key =",k1)
for k2,v2 := range v1{
fmt.Printf("\t%v = %v\n",k2,v2)
}
}//与二维数组近似相同一样的for-range结构
运行结果:
key = mon01
name = 白骨精
sex = 女
age = 1000
key = mon02
name = 狮子王
sex = man
age = 10085
key = mon03
name = 白蛇女
sex = 女
age = 1600
map的长度
使用的是len,len(map)返回的是map有几对
map切片
案例演示:
package main
import (
"fmt"
)
func main() {
//map切片
monslice := []map[string]string
monslice = make([]map[string]string,3)
if monslice[0] == nil{
monslice[0] = make(map[string]string,2)
monslice[0]["name"] = "jack"
monslice[0]["adress"] = "北京"
}
if monslice[1] == nil{
monslice[1] = make(map[string]string,2)
monslice[1]["name"] = "mary"
monslice[1]["adress"] = "北京"
}
if monslice[2] == nil{
monslice[2] = make(map[string]string,2)
monslice[2]["name"] = "jsith"
monslice[2]["adress"] = "北京"
}
newMonslice := map[string]string{
"name" : "tom"
"adress" :"上海"
}
monslice = append(monslice.newMonslice)//这就是进行append增加
}
map使用细节
1)map是引用类型,遵循的是引用类型传递的机制,在一个函数接收map,修改后,会直接修改原来的map
2)map的容量达到最大后,在想要增加map容量,会自动的扩展,不会发生panic,也就是说map能够动态增长
3)map的value也经常使用的是struct类型,更加适合管理负责的数据
struct
-
Golang也支持面向像编程(OOP),但是和传统的面向对象编程有区别,并不是存粹的面向对象,所以我们一般是说golang支持golang面向对象编程特性是比较精准的
-
go语言的面向对象是基于结构体(struct)来实现oop特性的
-
其中golang非常的简洁,去掉了传统的oop语言的继承,方法重载,构造函数和解析函数、隐藏的this函数指针等等
-
golang依然有面向对象编程的继承、封装和堕胎的特性,只是实验oop的特性和其他的语言不一样
快速入门
package main
import (
"fmt"
)
type Student struct{
Name string
Age int
Adress string
}
func main() {
//第一种方法定义
var student01 Student
student01.Name = "jack"
student01.Age = 10
student01.Adress = "北京"
//第二种方法:
var stu Student = Student{"mary",18,"上海"}
//方法三:
//运用new
var stu02 *Student = new(Student)
//这里可以用两种方法
//1.
*(stu02).Name = "sith"
*(stu02).Age = 17
*(stu02).Adress= "深圳"
stu02.Name = "sith"
stu02.Age = 17
stu02.Adress= "深圳"//这样也是,可以的golang设置方便
//方法4:
var stu04 *Student = &Student{//里面可以写变量,也可以不写,不写就像上面的new一样}
}
字段
struct里面的属性是字段
1)字段的一般表示的方式是 字段名 字段型
2)字段的类型可以为:基本类型