Golang通脉之map概略

2026-07-21 02:31:29/知识/814 阅读

Go言语中供给的通脉映拍照干容器为map ,其内部独霸散列表(hash)完成。概略

map 是通脉一种无序的键值对的集结 。map 最次要的概略一点是经由过程 key 来疾速检索数据,key 近似于索引,通脉指向数据的概略值 map 是一种集结,所以可以像迭代数组和切片那样迭代它 。通脉不过,概略map 是通脉无序的,没法决意它的概略前去按序,这是通脉因为 map 是独霸 hash 表来完成的 ,Go言语中的概略map是援引圭表类型,必须初始化才调独霸 。通脉

独霸map过程中需求寄看的概略几点 :

  • map是无序的 ,每次打印出来的通脉map都邑不一样 ,它不克不及经由过程index掉落踪掉落踪 ,而必须经由过程key掉落踪掉落踪
  • map的长度是不结实的,也就是和slice一样  ,也是一种援引圭表类型
  • 内置的len函数一样合用于map,前去map具有的key的数量
  • map的key可所以全数可斗劲的圭表类型,如布尔型 、整数型 、浮点型、宏壮型、字符串型……也可以键。

1、定义

Go言语中 map的定义语法以下:

map[KeyType]ValueType

个中

  • KeyType:展示键的圭表类型 。
  • ValueType:展示键对应的值的圭表类型。

**map圭表类型的变量默许初始值为nil ,需求独霸make()函数来分拨内存 (声明并初始化) **。

语法为:

make(map[KeyType]ValueType, [cap])

个中cap展示map的容量,该参数当然不是必须的 ,可是我们理应在初始化map的时辰就为其指定一个契合的容量。

可独霸内建函数 make ,也可独霸 map 关头字来定义 Map:

/* 声明变量,默许 map 是 nil */var mapVariable map[KeyType]ValueType /* 独霸 make 函数 */mapVariable = make(map[keyType]ValueType)rating := map[string]float32 { "C":5, "Go":4.5, "Python":4.5, "C++":2 }

假定不初始化 map ,那么就会成立一个 nil map 。nil map 不克不及用来存放键值对

2、根本独霸

map中的数据都是成对展示的:

func main() {  scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["小明"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["小明"]) fmt.Printf("type of a:%T\n", scoreMap)}

输进:

map[小明:100 张三:90]
100
type of a:map[string]int

map也支撑在声明的时辰加添元素 ,比如:

func main() {  userInfo := map[string]string{   "username": "张三",  "password": "123456", } fmt.Println(userInfo) //}

3 、剖断键可否存在

Go言语中有个剖断map中键可否存在的出格写法 ,格式以下:

value, ok := map[key]func main() {  /* 成立集结 */   countryCapitalMap := make(map[string]string)      /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" // 假定key存在ok为true,v为对应的值;不存在ok为false,v为值圭表类型的零值 v, ok := countryCapitalMap["United States"] if ok {   fmt.Println("Capital of United States is", captial)     }else {       fmt.Println("Capital of United States is not present")    }}

4 、map的遍历

Go言语中独霸for range遍历map  。

func main() {  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" for k, v := range countryCapitalMap {   fmt.Println(k, v) }}

只想遍历key的时辰,可以按上面的写法 :

func main() {  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" for k := range countryCapitalMap {   fmt.Println(k) }}

寄看:遍历map时的元素按序与添加键值对的按序有关 。

5 、delete()函数删除map元素

独霸delete()内建函数从map中删除一组键值对  ,删除函数不前去任何值,delete()函数的格式以下 :

delete(map, key)

个中 ,

  • map:展示要删除键值对的map
  • key:展示要删除的键值对的键
func main(){  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对	,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" delete(countryCapitalMap, "France")//将"France":"Paris"从map中删除 for k,v := range scoreMap{   fmt.Println(k, v) }}

6 、指定按序遍历map

func main() {  rand.Seed(time.Now().UnixNano()) //初始化随机数种子  var scoreMap = make(map[string]int, 200)  for i := 0; i < 100; i++ {   key := fmt.Sprintf("stu%02d", i) //生成stu开首的字符串  value := rand.Intn(100)          //生成0~99的随机整数  scoreMap[key] = value } //掏出map中的全数key存进切片keys var keys = make([]string, 0, 200) for key := range scoreMap {   keys = append(keys, key) } //对切片举办排序 sort.Strings(keys) //屈就排序后的key遍历map for _, key := range keys {   fmt.Println(key, scoreMap[key]) }}

7、map圭表类型的切片

上面的代码切片中的元素为map圭表类型时的独霸:

func main() {  var mapSlice = make([]map[string]string, 3) for index, value := range mapSlice {   fmt.Printf("index:%d value:%v\n", index, value) } fmt.Println("after init") // 对切片中的map元素举办初始化 mapSlice[0] = make(map[string]string, 10) mapSlice[0]["username"] = "张三" mapSlice[0]["password"] = "123456" mapSlice[0]["address"] = "深圳" for index, value := range mapSlice {   fmt.Printf("index:%d value:%v\n", index, value) }}

8、value为切片圭表类型的map

上面的代码演示了map中值为切片圭表类型的独霸:

func main() {  var sliceMap = make(map[string][]string, 3) fmt.Println(sliceMap) fmt.Println("after init") key := "中国" value, ok := sliceMap[key] if !ok {   value = make([]string, 0, 2) } value = append(value, "北京", "上海") sliceMap[key] = value fmt.Println(sliceMap)}

9 、map是援引圭表类型

与切片近似,map是援引圭表类型。当将map分拨给一个新变量时,它们都指向不异的内部数据筹划 。是以 ,一个的改削会回响此外一个 :

func main() {       personSalary := map[string]int{         "steve": 12000,        "jamie": 15000,    }    personSalary["mike"] = 9000    fmt.Println("Original person salary", personSalary)    newPersonSalary := personSalary    newPersonSalary["mike"] = 18000    fmt.Println("Person salary changed", personSalary) }

运转下场:

Original person salary map[steve:12000 jamie:15000 mike:9000] 
Person salary changed map[steve:12000 jamie:15000 mike:18000]

map不克不及独霸独霸符举办斗劲 。只能用来搜检map可否为空 。不然会报错:invalid operation: map1 == map2 (map can only be comparedto nil)

到此这篇关于Golang通脉之map概略的文章就引见到这了,更多相干Go言语 map内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!

#免责声明#

本站提供的一切资源、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络收集整理,版权争议与本站无关。