Go语言-复合数据结构(map)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanchunsheng/article/details/79615591

1. map基本操作

map也就是通常所说的哈希表,字典等。基本构成元素是 key-value 对,可以实现快速定位key,不需要遍历整个结构来查找某个key对应的value,这点非常重要,不要自己实现需要遍历表格才能查找匹配的数据结构。

1.1 增(初始化)

上代码:

package main
import (
    "fmt"
    "os"
)

func main () {
    argsMap := make(map[string]int)
    for idx := 1; idx < len(os.Args); idx++ {
        argsMap[os.Args[idx]] = idx
    }
    fmt.Println(argsMap)
}

运行:

$go run main.go 1 3 -X ?
map[1:1 3:2 -X:3 ?:4]

可以看到,定义一个map,可以通过内置命令 make 完成,需要给出key的类型和value的类型:

/* key的类型是string,value的类型是int*/
argsMap := make(map[string]int)     

/* 如果map定义中,key是int,value是string,也可以*/
argsMap := make(map[int]string)
argsMap[idx] = os.Args[idx]
map[1:1 2:3 3:-X 4:?]

事实上,对于key的类型,只要能够通过 “==” 判断是否等同的,都可以,不限于string或者int。value的类型更没有什么限制。

对key-value条目的添加和修改,通过赋值语句直接完成:

argsMap[os.Args[idx]] = idx
argsMap["key1"] = 1

/* make(map[string]string) */
anotherMap["key2"] = "2nd key"

1.2 删

删除map中的一个条目,通过内置的命令delete完成 (注意key和value的类型有变化)

package main
import (
    "fmt"
    "os"
)

func main () {
    argsMap := make(map[int]string)
    for idx := 1; idx < len(os.Args); idx++ {
        argsMap[idx] = os.Args[idx]
    }
    delete(argsMap, len(os.Args))
    delete(argsMap, len(os.Args) - 1)
    fmt.Println(argsMap)
}

delete的格式是:

delete(map名称,key值)

key值是否已经存在于map中,并不重要,从上面例子可以看到 len(os.Args) 并不存在于 argsMap 中,但是delete也不会报错。
上述例子的运行结果如下:

$go run main.go 1 3 -X ?
map[1:1 2:3 3:-X]

这里有个地方需要尤其注意,map中的 key-value 对的顺序是不固定的。例如本例中的argsMap,上面输出是按照1,2,3的key顺序,但是多次执行后,会出现以下结果:

map[3:-X 1:1 2:3]

不要期望map是有顺序的,不要依赖于map的顺序编程

1.3 改

改比较容易,通过复制语句就可以修改:

argsMap[2] = "2nd value"
argsMap[2] = "second value"

最后赋的值是最终的value。

1.4 查

检查一个map中是否有某一个key,使用一个惯用的写法:

if v, ok := argsMap["key1"]; ok {
    fmt.Println("key1:", v)
}

argsMap[“key1”]表达式多重返回

  • v 是value的值(如果key能够找到),如果单纯判断key,并不需要value,可以用占位符 _ 占位
  • ok 是bool类型值,如果key能够找到,其为true,否则是false

if语句通过 ok 的结果决定是否进入花括号中。

1.5 遍历

对map的遍历可以通过for语句完成:

for k, v := range argsMap {
    fmt.Println("Key:", k , " Value:", v)
}

2. map类型的函数参数

map类型的变量,作为函数的参数,是引用传递的,也就是说,被调用函数如果修改了传递进来的map类型的参数,那么返回主调函数后,改动也是保留下来的。

package main
import (
    "fmt"
    "os"
)
func main() {
    var argsMap = make(map[string]int)
    for idx, arg := range os.Args[1:] {
        argsMap[arg] = idx
    }
    fmt.Println(argsMap)
    double(argsMap)
    fmt.Println(argsMap)    
}

func double(srcMap map[string]int) {
    for k, v := range srcMap {
        srcMap[k] = 2 * v
    }
}
--------------------------
$ go run main.go one two three
map[three:2 one:0 two:1]
map[two:2 three:4 one:0]

猜你喜欢

转载自blog.csdn.net/guanchunsheng/article/details/79615591