Go-Maps

语法汇总

前面介绍的array、slice都是顺序性列表,本节的map则是无序的。

这个map和C/C++/Java的map一样,在Python中称为字典/dictionary。但Golang中map的用法更符合脚本语言的特点,和Python很像。

涉及的主要语法点:

var the_map map[string]int
the_map := make(map[string]int)
the_map := map[string]int {key:value, ...}
value, ok := the_map[key]    

示例-基本用法

下面这个例子给出了map的声明方法。但通常并不这么使用,因为这种声明之后必须要调用make()初始化之后才可赋值,与其这样,不如直接:= make()这种方式。

package main

/*
D:\examples>go run helloworld.go
panic: assignment to entry in nil map

goroutine 1 [running]:
panic(0x45a540, 0xc04203a000)
        C:/Go/src/runtime/panic.go:500 +0x1af
main.main()
        D:/examples/helloworld.go:13 +0x6f
exit status 2

D:\examples>
*/
func main() {
    //x is a map of strings to ints. -- Reference: <<Introducing Go>> Slice, Map, P38 
    var x map[string]int

    x["first"] = 1
}

示例-make()

package main
import "fmt"

/*
D:\examples>go run helloworld.go
x:      1       2

D:\examples>
*/
func main() {
    x := make(map[string]int)

    x["first"] = 1 
    x["second"] = 2
    debug_map(x, "x:")
}

func debug_map(the_map map[string]int, msg string) {
    fmt.Print(msg, "\t")
    for _, item := range the_map {
        fmt.Print(item, "\t")
    }
    fmt.Println()
}

示例-make与初始化列表

这里所谓“初始化列表”借用C++的initialization list。在make的同时,给map指定key:value列表。

package main
import "fmt"

/*
D:\examples>go run helloworld.go
x:      1       2

D:\examples>
*/
func main() {
    x := map[string]int {
        "first" : 1,
        "second" : 2,
    }

    debug_map(x, "x:")
}

func debug_map(the_map map[string]int, msg string) {
    fmt.Print(msg, "\t")
    for _, item := range the_map {
        fmt.Print(item, "\t")
    }
    fmt.Println()
}

示例-判断元素是否存在

即便key不存在,调用the_map[the_key]的时候也不会抛出运行时异常。这和编译型语言、以及脚本语言Python都不一样。Go的处理方式更为优雅,写的代码行数也少。

package main
import "fmt"

/*
D:\examples>go run helloworld.go
a:  1
b:  0
value:  1 , exist:  true
Exist
value:  0 , exist:  false
Not exist.

D:\examples>
*/
func main() {
    x := map[string]int {
        "first" : 1,
        "second" : 2,
    }

    a := x["first"]
    b := x["third"]
    fmt.Println("a: ", a)
    fmt.Println("b: ", b)

    find_map(x, "first")
    find_map(x, "fourth")
}

func debug_map(the_map map[string]int, msg string) {
    fmt.Print(msg, "\t")
    for _, item := range the_map {
        fmt.Print(item, "\t")
    }
    fmt.Println()
}

func find_map(the_map map[string]int, key string) {
    value, exist := the_map[key]
    fmt.Println("value: ", value, ", exist: ", exist)

    if exist {
        fmt.Println("Exist")
    } else {
        fmt.Println("Not exist.")
    }
}

value

map的value可以是任何的数据,比如value本身也可以是map。这是Introducing Go中给出的例子,这里不再展开。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-05-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

厚土Go学习笔记 | 15. defer语句延迟函数的执行

当函数中有defer语句,会延迟此语句的执行,直到函数返回后才执行。 defer fmt.Println("") defer后面的是参数 延迟调用的参数是立刻生...

2798
来自专栏C/C++基础

web前端开发初学者十问集锦(4)

利用JS来控制页面控件的显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位。

1762
来自专栏ACM算法日常

棋盘(数学趣味题) - HDU 5100

Consider the problem of tiling an n×n chessboard by polyomino pieces that are k×...

823
来自专栏Nian糕的私人厨房

JavaScript 基础

JavaScript 是一种轻量级,解释型的,有着函数优先 (First-class Function) 的编程语言,虽然它是作为开发 WEB 页面的脚本语言而...

1255
来自专栏流浪猫的golang

go rune 简要分析

今天看golang代码看到一个单词 rune ,熟悉而陌生。之前学习go并没有过多注意这个“神秘符号”。 rune在golang中是int32的别名,在各个...

841
来自专栏企鹅号快讯

一文快入VBA——一个VBA数据处理小程序的解析

这是我自己写的一个VBA处理的小程序,它极大地帮助我提高了数据处理的速度,现在我把它分享给你。个人觉得如果能够看看该程序,ExcelVBA使用的基本问题就不是比...

2937
来自专栏守候书阁

实例感受-es6的常用语法和优越性

前几天,用es6的语法重写了我的一个代码库,说是重写,其实改动的并不多,工作量不大。在重写完了的时候,就个人总结了一下es6常用的一些常用的语法和比es5优越的...

853
来自专栏Golang语言社区

Go-Maps

语法汇总 前面介绍的array、slice都是顺序性列表,本节的map则是无序的。 这个map和C/C++/Java的map一样,在Python中称为字典/di...

34110
来自专栏眯眯眼猫头鹰的小树杈

leetcode337. House Robber III

最开始的思路我是采用自顶向下递归遍历树的形式来计算可能获得的最大收益。当前节点的情况有两种:选中或是没选中,如果选中的话,那么两个直接子节点将不可以被选中,如果...

1163
来自专栏软件开发

C语言 第六章 多重循环

一、概要 在c语言中,if,switch,for,while,do-while可以相互间多次嵌套。 if(){   for()   {     for()   ...

2475

扫码关注云+社区

领取腾讯云代金券