Map1

map是key-value数据结构,又称为字段或者关联数组。类似其他编程语言中的集合,在编程中是经常使用到。

map的声明:

基本语法:

  var map变量名 map[keytype]valuetype

key 可以是什么类型?

  golang中的map,的key 可以是很多种类型,比如 bool,数字,string,指针,channel,还可以是只包含前面几个类型的 接口,结构体,数组

  通常为int、string

  注意:slice,map还有 function 不可以,因为这几个没法用==来判断


valuetype 可以是什么类型?

  valuetype 的类型和key 基本一样

  通常为:数字(整数,浮点数),string,map,struct

 

map声明的举例:

var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string

注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。

func main() {

  //map的声明和注意事项
  var a map[string]string
  //在使用map前需要先make,make的作用就是给map分配数据空间
  a = make(map[string]string, 10)
  a["no1"] = "宋江"
  a["no2"] = "吴用"
  a["no1"] = "武松"
  a["no3"] = "吴用"
  fmt.Println(a)
}

对上面代码的说明:

1)map 在使用前一定要make

2)make 的key 是不能重复,如果重复了,则以最后这个key-value为准

3)map 的value 是可以相同的。

4)map 的key-value 是无序的。


func make

func make(Type, size IntegerType) Type

  make 内建函数分配并初始化一个类型为切片、映射、或(仅仅为)信道的对象。 与 new 相同的是,其第一个实参为类型,而非值。不同的是,make 的返回类型 与其参数相同,而非指向它的指针。其具体结果取决于具体的类型:

    切片:size 指定了其长度。该切片的容量等于其长度。第二个整数实参可用来指定不同的容量;它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。

    映射:初始分配的创建取决于 size,但产生的映射长度为0。size 可以省略,这种情况下就会分配一个小的起始大小。

    信道:信道的缓存根据指定的缓存容量初始化。若 size 为零或被省略,该信道即为无缓存的。

 

map使用方式有下面几种,我们分别演示:

1)方式1

  //声明,这时map=nil
  var cities map[string]string
  //make(map[string]string, 10) 分配一个map空间
  cities = make (map[string]string, 10)

2)方式2

  //声明,就直接make

  var cities = make(map[string]string)

  func main() {

    cities := make(map[string]string)
    cities["no1"] = "北京"
    cities["no2"] = "天津"
    cities["no3"] = "上海"
    fmt.Println(cities)
  }

3)方式3

  //声明,直接赋值

  var cities map[string]string = map[string]string {
    "no4" : "成都",
  }

  cities["no1"] = "北京"


  func main() {

    var cities = map[string]string {"no4":"成都"}
    cities["no1"] = "北京"
    fmt.Println(cities)
  }

  也可以用类型推导:

  func main() {

    cities := map[string]string {"no4":"成都"}
    cities["no1"] = "北京"
    fmt.Println(cities)
  }

 

课堂练习:演示一个key-value 的value 是map的案例
比如:我们要存放3个学生信息,每个学生有name和sex信息

思路:map[string]map[string]string

案例:

func main() {

  studentMap := make(map[string]map[string]string, 10)
  studentMap["stu01"] = make(map[string]string, 3)
  studentMap["stu01"]["name"] = "tom"
  studentMap["stu01"]["sex"] = "男"
  studentMap["stu01"]["address"] = "北京长安街"

  studentMap["stu02"] = make(map[string]string, 3)   //这句话不能少
  studentMap["stu02"]["name"] = "mary"
  studentMap["stu02"]["sex"] = "女"
  studentMap["stu02"]["address"] = "北京东沙村"

  fmt.Println(studentMap["stu01"])
  fmt.Println(studentMap["stu02"]["address"])
}

 

posted @ 2019-08-23 22:47  我是一只忙碌的小青蛙  阅读(214)  评论(0编辑  收藏  举报