Map定义和使用
map[ key ]value map[ 键类型 ]值类型
- 直接创建
package main
import "fmt"
func main() {
var m map[int]string
//不能直接添加数据
//m[10] = "PHP转GO" //err:map是一个空的地址,地址编号为0x0
fmt.Printf("%p\n", m) //0x0
}
注意观察地址!!!
- 初始化
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]) // 初始化
}
- 还能通过自动类型初始化定义,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:王五]
}