Go 开发常用操作技巧--map

简介: map 是一种特殊的数据类型,它是一种元素对的无序集合,元素对为 键(key)值(value) 形式。我们可以通过 key 来快速找到与之对应的 value。

map 是一种特殊的数据类型,它是一种元素对的无序集合,元素对为 键(key)值(value) 形式。我们可以通过 key 来快速找到与之对应的 value。

map 是引用类型,声明方式:

var name map[key_type]value_type,name 为map的变量名,key_type 为键类型,value_type 为键对应的值类型。声明时可以不需要指定 map 的长度,因为 map 是可以动态增长的。未初始化的 map 的值是 nil。

检查一个键是否在 map 中

检查一个 key 在 map 主要是通过下面的方式:

if v, ok := map[key]; ok{
  // 存在
}
复制代码

ok 为 true 表示存在,key 对应的值为 v,若不需要获取值则可以用 '_'代替,即:if _, ok := map[key]; ok{}

json 与 map 互转

  1. json 转 map:
package main
import (
  "encoding/json"
  "fmt"
)
func main() {
  jsonStr := `
{
    "name":"test",
    "address":"beijing"
}`
  var mapRes map[string]interface{}
  err := json.Unmarshal([]byte(jsonStr), &mapRes)
  if err != nil {
    fmt.Println(err)
  }
  fmt.Println(mapRes)
}
复制代码

运行结果:

map[address:beijing name:test]
复制代码
  1. map 转 json:
package main
import (
  "encoding/json"
  "fmt"
)
func main() {
  mapRes := map[string]interface{}{
    "name":    "test",
    "address": "beijing",
  }
  jsonStr, err := json.Marshal(mapRes)
  if err != nil {
    fmt.Println(err)
  }
  fmt.Println(string(jsonStr))
}
复制代码

运行结果:

{"address":"beijing","name":"test"}
复制代码

map 排序

Go 语言中,map 是无序的,如果需要对 map 进行排序,实现的思路是:将 map 中的 key  复制到一个切片中,然后对此切片进行排序,再遍历此切片,获取对应的 key 、value。

示例:

package main
import (
  "fmt"
  "sort"
)
func main() {
  mapRes := make(map[int]int,5)
  mapRes[0] = 1
  mapRes[1] = 3
  mapRes[2] = 2
  var temp []int
  for _,v := range mapRes{
    temp = append(temp,v)
  }
  sort.Ints(temp)
  for k, v := range temp {
    fmt.Println(k, v)
  }
}
复制代码

运行结果:

0 1
1 2
2 3
复制代码

map 类型的切片

如果要使用一个 map 类型的切片,必须使用两次 make() 函数,一次分配切片,一个分配切片中的每个 map 元素。

示例:

package main
import "fmt"
func main() {
  sli := make([]map[int]int, 3)
  for i := range sli {
    sli[i] = make(map[int]int, 6)
    sli[i][1] = 1+i
    sli[i][2] = 2+i
  }
  fmt.Printf("value:%v\n", sli)
}


相关文章
|
4月前
|
Go
go语言中遍历映射(map)
go语言中遍历映射(map)
120 8
|
15天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
2月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
|
7月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
3月前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
92 12
|
3月前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
4月前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
64 2
|
4月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
62 3
|
4月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
50 3
|
6月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19