Go语言入门-常用数据结构-映射-map
定义
概述
A map is an unordered group of elements of one type, called the element type, indexed by a set of unique keys of another type, called the key type. The value of an uninitialized map is nil.–字典是一种类型的无序元素组,称为元素类型,由唯一键(称为键类型)索引关联其他类型组成。 未初始化映射的值为nil。引用类型。
1.key必须是支持相等运算符 ("=="、"!=") 类型, 如 number、string、 pointer、array、struct,以及对应的 interface。值可以是任意类型,没有限制。
2. map类型的变量默认初始值为nil,需要使用make()函数来分配内存。或者使用初始化表达式,进行初始化。否则会发生panic(map类型的变量默认初始值为nil,需要使用make()函数来分配内存)
3. map是 not addressable不能直接修改value的值
4. 创建时准备足够内存,能够减少扩张的内存分配和重复哈希的动作。
5. map是并发不安全的。
map定义语法
var mapVal map[Type]Type //声明map
var mapVal map[Type]Type = map[Type]Type {
//表达式初始化
"key1" : value1,
...
"keyN" : valueN,
}
var mapVal map[Type]Type = make(map[Type]Type) //make 不指定容量cpa
var mapVal map[Type]Type = make(map[Type]Type, cap) //make 指定容量
map定义示例
- 示例1
普通map的声明,实际引用的都是nil
func main() {
//普通map声明,不初始化
var map1 map[int]string
var map2 map[interface{
}]string
//实际都是引用nil
fmt.Printf("%#v\n", map1)
//实际值都是引用nil
fmt.Printf("%#v\n", map2)
}
/**
output:
map[int]string(nil)
*/
- 示例2
map使用初始化表达式进行初始化。
func main() {
//声明
var map1 map[int]string
//表达式初始化
map1 = map[int]string{
1 : "hello",
2 : "hello1",
3 : "hello2",
}
fmt.Printf("%#v\n", map1)
//interface空接口可以映射int
//声明+表达式初始化
var map2 map[interface{
}]int = map[interface{
}]int{
1 : 1,
2 : 2,
3 : 3,
}
fmt.Printf("%#v\n", map2)
}
/**
output:
map[int]string{1:"hello", 2:"hello1", 3:"hello2"}
map[interface {}]int{1:1, 2:2, 3:3}
*/
- 示例3
通过make定义map不带容量 - TODO 不带容量的map初始map是多少?
func main() {
//make定义了一个map,该map初始没有值。
map1 := make(map[string]int)
fmt.Printf("%#v\n", map1)
map1["sdff"] = 1
map1["sdff2"] = 2
map1["sdff2"] = 3