go Map详解


Map定义和使用

map[ key ]value map[ 键类型 ]值类型

  1. 直接创建
package main

import "fmt"

func main() {
	var m map[int]string
	//不能直接添加数据
	//m[10] = "PHP转GO" //err:map是一个空的地址,地址编号为0x0
	fmt.Printf("%p\n", m) //0x0
}

注意观察地址!!!

  1. 初始化
package main

import "fmt"

func main() {
	var m map[int]string = map[int]string{10: "PHP转GO", 16: "张三", 666: "初始化"}
	fmt.Printf("%p\n", m) //0xc000100480
	fmt.Println(m)        //map[10:PHP转GO 16:张三 666:初始化]
}

map存储的方式不是顺序存储的,每一次打印map顺序可能不一样。

由于map不是通过下标访问值,所以不能用for下标进行遍历,想要遍历map用 for k,v := range,k对应key,v对应value。

package main
import "fmt"
func main() {
   var m map[int]string = map[int]string{10: "PHP转GO", 16: "张三", 666: "初始化"}
   for k, v := range m {
      fmt.Println(k, v)
   }
}

运行结果:
在这里插入图片描述
再运行一下?多运行几次
在这里插入图片描述

我们还能通过具体的key进行访问具体的值

package main

import "fmt"

func main() {
	var m map[int]string = map[int]string{10: "PHP转GO", 16: "张三", 666: "初始化"}
	fmt.Println(m[666]) // 初始化
}

  1. 还能通过自动类型初始化定义,make,和之前创建是有区别的,地址不是0x0!!!

make( map[key]value ) make( map[key]value , 长度 int)

注意map没有容量这一说

package main

import "fmt"

func main() {
	m := make(map[int]string)
	fmt.Printf("%p\n", m) //0xc0000c2450
fmt.Println(len(m)) //0  计算map的大小
m[10] = "PHP转GO" // 添加数据不会报错
fmt.Println(m)// map[10:PHP转GO]
}

内存编号为0的空间是系统占用,不允许进行读写操作,你不能往里面赋值也不能往里面取值。

map的长度是自动扩容的。

还有要注意的是:我们在往里面添加数据的时候,key要唯一,值可以重复。

 var m map[int]string = map[int]string{10: "PHP转GO", 16: "张三", 10: "初始化"} //err 整体定义的时候是不能重复的
var m map[int]string = map[int]string{10: "PHP转GO", 16: "张三", 666: "初始化"}
m[666] = "emmmm" //不会报错,这行属于重新赋值的过程

Map的键和值

键的类型必须是支持==和!=操作符的类型(或者叫知道大小的数据),切片、函数以及包含切片的结构类型不能作为字典的键,使用这些类型会造成编译错误。

m := make(map[ []int ]int) // err:invalid map key type []int

package main

import "fmt"

func main() {
	m := make(map[[2]int]int)
	arr := [2]int{1, 2}
	m[arr] = 666
	fmt.Println(m) //map[[1 2]:666]
}

我们一般不会把键用复合类型,一般值是复合类型。
map[ int ] [2]int

package main

import "fmt"

func main() {
	m := make(map[int][2]int)
	arr := [2]int{1, 2}
	m[666] = arr
	fmt.Println(m) //map[666:[1 2]]
}

在map中只能通过key找到值,不能通过值找key。 例如:fmt.Println( m[值] )//err

如果通过key没找到具体的值,返回的是value具体类型的默认值。例如:fmt.Println( m[key] )

判断map中的key和值 是否存在

value , ok := m[key]

第一个返回值为key所对应的value,第二个返回值为key是否存在的条件,存在ok为true (bool类型)。

package main
import "fmt"
func main() {
   m := make(map[int]int)
   value, ok := m[123]
   if ok {
      fmt.Println(value)
   } else {
      fmt.Println("未找到数据")
   }
   // 结果: 未找到数据
}

删除map中的一个元素,根据key进行删除

delete( map , key ) 没有返回值

在进行数据删除时如果key不存在,不会报错。

package main
import "fmt"
func main() {
   m := make(map[int]string)
   m[666] = "张三"
   m[111] = "李四"
   fmt.Println(m) //map[111:李四 666:张三]
   delete(m, 666)
   fmt.Println(m) //map[111:李四]
}

Map作为函数参数

引用传递,形参和实参指向内存中相同的地址段,修改形参会影响实参。

package main
import "fmt"
func main() {
   m := map[int]string{1: "张三", 2: "李四"}
   fmt.Println(m) // map[1:张三 2:李四]
   demo(m)
   fmt.Println("---main---")
   //fmt.Printf("%p\n", m) //0xc0000c2450
   fmt.Println(m) //map[1:张三 2:李四 4:王五]
}
func demo(m map[int]string) {
   fmt.Println("---demo---")
   fmt.Println(m) //map[1:张三 2:李四]
   //fmt.Printf("%p\n", m) // 0xc0000c2450
   m[4] = "王五"
   fmt.Println(m) //map[1:张三 2:李四 4:王五]
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值