package main
import "fmt"
func main() {
var numbers map[string]int
numbers = make(map[string]int)
numbers["one"] = 1
numbers["ten"] = 10
numbers["three"] = 3
fmt.Println(numbers["three"])
fmt.Println(numbers["one"])
fmt.Println(numbers["ten"])
fmt.Println(numbers)
numbers["three"] = 9
fmt.Println(numbers["three"])
}
map 字典的概念,格式为map[keyType]valueType
map的读取和设置也类似slice一样,通过key来操作,这是slice的index只能是int,而map多了很多类型,可以是int,string以及所有完全定义了==于!=操作的类型
map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取
map的长度是不固定的,也就是和slice一样,也是一种引用类型
内置的len函数同样适用于map,返回map拥有key的数量
map的值修改numbers["three"]= 9
如果是数组就需要转成切面,map就可以直接修改
map的初始化可以通过key:val的方式初始化值,同时map内置有判断是否存在key的方式
map也是一种引用类型,如果两个map同时指向一个底层,那么一个改变,另一个也相应的改变
m := make(map[string]string)
m["hello"] = "bonjour"
m1 := m
m1["hello] = "salut"
此时m["hello"]的值也发生改变了
make 用于内建类型(map,slice,channel)的内存分配,new用于各种类型的内存分配
内建函数new本质上说跟其他语言中的同名函数功能一样,new(T)分配了零值填充的T类型内存空间,并且返回其地址,即一个*T类型的值,用GO术语说,他返回了一个指针,指向新分配的类型T的零值。
内建函数make(T,args)与new(T)有着不同的功能,make只能创建slice,map,channel并且返回一个有初始值的T类型,而不是*T,本质讲,导致三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。