环境
go version go1.10.1 darwin/amd64
映射
映射将键映射到值。
映射的零值为nil,nil映射既没有键,也不能添加键。make函数会返回给定类型的映射,并将其初始化备用。如下演示
package main
import "fmt"
// Rectangle width height
type Rectangle struct {
width, height float64
}
var m map[string]Rectangle
func main() {
m = make(map[string]Rectangle)
m["one"] = Rectangle{
40.68433, 74.39967,
}
fmt.Println(m["one"])
}
映射的语法
映射的语法与结构体相似,不过必须有键名。
package main
import "fmt"
// Rectangle width height
type Rectangle struct {
width, height float64
}
var m = map[string]Rectangle{
"one": Rectangle{
40.68433, 74.39967,
},
"two": Rectangle{
37.42202, 122.08408,
},
}
func main() {
fmt.Println(m)
}
映射的语法 特殊情况
若顶级类型只是一个类型名,则可以在语法的元素中省略它。
package main
import "fmt"
// Rectangle width height
type Rectangle struct {
width, height float64
}
var m = map[string]Rectangle{
"one": {40.68433, 74.39967},
"two": {37.42202, 122.08408},
}
func main() {
fmt.Println(m)
}
修改映射
在映射m中插入或修改元素:
m[key] = elem
获取元素:
elem = m[key]
删除元素:
delete(m, key)
通过双赋值检测某个键是否存在:
elem, ok = m[key]
若 key 在 m 中, ok 为 true ;否则, ok 为 false 。
若 key 不在映射中,那么 elem 是该映射元素类型的零值。
同样的,当从 映射 中读取某个不存在的键时,结果是 映射 的元素类型的零值。
注 :若 elem 或 ok 还未声明,可以使用短变量声明:
elem, ok := m[key]
下面看个详细的实例演示
package main
import "fmt"
func main() {
m := make(map[string]int)
m["Q"] = 42
fmt.Println("The value:", m["Q"])
m["Q"] = 48
fmt.Println("The value:", m["Q"])
delete(m, "Q")
fmt.Println("The value:", m["Q"])
v, ok := m["Q"]
fmt.Println("The value:", v, "status:", ok)
}
运行后结果如下
The value: 42
The value: 48
The value: 0
The value: 0 status: false
练习:映射
实现 WordCount 。它应当返回一个映射,其中包含每个字符串 s 中"单词"的个数。函数 wc.Test 会对此函数执行一系列测试用例,并输出成功还是失败。
strings.Fields[https://go-zh.org/pkg/strings/#Fields] 很有帮助。
这个是官网的例子,下面是我的实现方式,有兴趣的可以实现下
package main
import "strings"
import (
"golang.org/x/tour/wc"
)
func WordCount(s string) map[string]int {
var x = make(map[string]int)
for _,n := range strings.Fields(s) {
x[n] += 1
}
return x
}
func main() {
wc.Test(WordCount)
}
运行后输出结果如下
PASS
f("I am learning Go!") =
map[string]int{"I":1, "am":1, "learning":1, "Go!":1}
PASS
f("The quick brown fox jumped over the lazy dog.") =
map[string]int{"brown":1, "fox":1, "dog.":1, "The":1, "jumped":1, "over":1, "the":1, "lazy":1, "quick":1}
PASS
f("I ate a donut. Then I ate another donut.") =
map[string]int{"I":2, "ate":2, "a":1, "donut.":2, "Then":1, "another":1}
PASS
f("A man a plan a canal panama.") =
map[string]int{"A":1, "man":1, "a":2, "plan":1, "canal":1, "panama.":1}
PASS代表通过测试,给自己点个"赞"
版权声明
由 durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。