go——字典
Go中字典类型是散列表(hash table)的一个实现,其官方称谓是map。
散列表是一个实现了关联数组的数据结构,关联数组是用于表示键值对的无序集合的一种抽象数据类型。
Go中称键值对为键-元素对,它把字典中的每个键都看作与其对应的元素的索引,这样的索引再同一个字典值中是唯一的。
下面的代码声明了一个字典类型的变量:
var ipSwitches = map[string]bool{}
变量ipSwitches的键类型为string,元素类型为bool。
map[string]bool{}表示了一个不包含任何元素的字典值。
与切片类型一样,字典类型是一个引用类型。也正因此,字典类型的零值是nil。
字典值的长度表示了其中的键-元素对的数量,其零值的长度总是0.
将其作为语言内置类型,从运行时层面进行优化,可获得更高效的性能。
作为无序键值对集合,字典要求key必须是支持相等运算符(==、!=)的数据类型。
字典是引用类型,使用make函数或初始化表达式来创建。
package main
import "fmt"
func main() {
m := make(map[string]int) //make函数创建
m["a"] = 1
m["b"] = 2
m2 := map[int]struct { //key的类型int,value的类型struct
x int
}{
1: {x: 100},
2: {x: 200},
}
fmt.Println(m, m2) //map[a:1 b:2] map[1:{100} 2:{200}]
}
字典的基本操作:增删改查
package main
import "fmt"
func main() {
m := map[string]int{
"a": 1,
"b": 2,
}
m["a"] = 10 //修改
m["c"] = 30 //添加
fmt.Println(m) //map[a:10 b:2 c:30]
if v, ok := m["d"]; ok { //使用ok-idiom判断键是否存在
fmt.Println(v)
}
delete(m, "b") //删除一个键值对
fmt.Println(m) //map[a:10 b:2 c:30]
fmt.Println(m["f"]) //0 访问不存在的键值对时返回0值
}
对字典进行迭代每次返回的键值次序都不相同
package main
import "fmt"
func main() {
m := make(map[string]int)
for i := 0; i < 7; i++ {
m[string('a'+i)] = i
}
for i := 0; i < 4; i++ {
for k, v := range m {
fmt.Printf("%s:%d ", k, v)
}
fmt.Println()
}
}
/*
g:6 a:0 b:1 c:2 d:3 e:4 f:5
e:4 f:5 g:6 a:0 b:1 c:2 d:3
g:6 a:0 b:1 c:2 d:3 e:4 f:5
a:0 b:1 c:2 d:3 e:4 f:5 g:6
*/
函数len返回当前键值对的数量,cap不接受字典类型.
因内存访问安全和哈希算法等缘故,字典被设计成"not addressable",
因此不能直接修改value成员(结构或数组)。
package main
import "fmt"
func main() {
type user struct {
name string
age int
}
m := map[int]user{
1: {"kebi", 19},
}
fmt.Println(len(m)) //1
fmt.Println(cap(m)) //invalid argument m (type map[int]user) for cap
m[1].age += 1 // cannot assign to struct field m[1].age in map
}
正确的做法是返回整个value,待修改后再设置字典键值,或直接用指针类型。
package main
import "fmt"
func main() {
type user struct {
name string
age int
}
m := map[int]user{
1: {"kebi", 19},
}
u := m[1] //取出整个value值
u.age += 1 //现在操作的对象是结构体
m[1] = u //重新赋值
fmt.Println(m)
m2 := map[int]*user{ //value是指针类型
1: &user{"Jack", 20},
}
m2[1].age++ //m2[1]返回的是指针,透过指针修改目标对象
fmt.Println(m2[1])
}
不能对nil字典进行赋值操作,但却能读。
package main
import "fmt"
func main() {
var m map[string]int //只进行声明的字典是nil字典
fmt.Println(m["a"]) //0
// m["a"] = 1 //panic: assignment to entry in nil map
m2 := map[string]int{}
fmt.Println(m == nil, m2 == nil) //true false
}
在迭代期间删除或新增键值是安全的。
package main
import "fmt"
func main() {
m := make(map[int]int)
for i := 0; i < 10; i++ {
m[i] = i + 10
}
for k := range m {
if k == 5 {
m[100] = 1000
}
delete(m, k)
fmt.Println(k, m)
}
}
/*
0 map[9:19 2:12 6:16 8:18 7:17 1:11 3:13 4:14 5:15]
2 map[5:15 7:17 1:11 3:13 4:14 8:18 9:19 6:16]
6 map[4:14 5:15 7:17 1:11 3:13 8:18 9:19]
8 map[7:17 1:11 3:13 4:14 5:15 9:19]
9 map[4:14 5:15 7:17 1:11 3:13]
1 map[3:13 4:14 5:15 7:17]
3 map[4:14 5:15 7:17]
4 map[5:15 7:17]
5 map[7:17 100:1000]
7 map[100:1000]
*/
运行时会对字典并发操作做出检测.如果某个任务正在对字典进行写操作,
那么其它任务就不能对该字典执行并发操作(读写删除),否则会导致进程崩溃.
package main
import "time"
func main() {
m := make(map[string]int)
go func() {
for {
m["a"] += 1
time.Sleep(time.Microsecond)
}
}()
go func() {
for {
_ = m["b"]
time.Sleep(time.Microsecond)
}
}()
select {}
}
//fatal error: concurrent map read and map write
go——字典的更多相关文章
- 【DG】Oracle_Data_Guard官方直译
[DG]Oracle Data Guard官方直译 1 Oracle Data Guard 介绍 Oracle Data Guard概念和管理10g版本2 Oracle Data Guard ...
- DVWA实验之Brute Force(暴力破解)- Low
DVWA实验之Brute Force-暴力破解- Low 这里开始DVWA的相关实验~ 有关DVWA环境搭建的教程请参考: https://www.cnblogs.com/0yst3r-2 ...
- Oracle错误览表
Oracle 错误总结及问题解决 ORA 本文转自:https://www.cnblogs.com/zhangwei595806165/p/4972016.html 作者@承影剑 ORA-0 ...
- Javacript实现字典结构
字典是一种用[键,值]形式存储元素的数据结构.也称作映射,ECMAScript6中,原生用Map实现了字典结构. 下面代码是尝试用JS的Object对象来模拟实现一个字典结构. <script& ...
- python 数据类型 ----字典
字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...
- 增强版字典DictionaryEx
代码 public class DictionaryEx<TKey, TValue> : IDictionary<TKey, TValue> { /// <summary ...
- python学习笔记(字符串操作、字典操作、三级菜单实例)
字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...
- python之最强王者(8)——字典(dictionary)
1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- PowerDesigner从Sqlserver中反转为带注释的字典及快捷键操作
PowerDesigner的操作经常忘记,所以把常用的功能记录下来备忘. 1.修改反转过来的字段 PowerDesigner从数据库反转的时候,默认不带注释,需要先进行修改. 输入如下脚本: {OWN ...
随机推荐
- Chapter 2 JavaScript Basic
Has 5 primitive types: Undefined, Null, Boolean, String, Number. typeof operator Undefined return u ...
- linux2.4中netfilter_nat_alg机制分析--以FTP流程为例,分析NAT和ALG
以FTP流程为例,分析NAT和ALG 网络环境: ×5+6=1286) 创建×5+6=1286),更新skb的应用层信息(这里应用层信息还是×5+6=1286) 创建×5+6=1286) 创建×5+6 ...
- linx常用查看命令和内存分配及释放
1.命令行 运行时间多久:uptime 查看时间日期: date:date -s '2014-7-4 10:35:20' hwcloc 查看内存分配: top free:http://blog.cs ...
- 【BZOJ】1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会(tarjan)
http://www.lydsy.com/JudgeOnline/problem.php?id=1654 请不要被这句话误导..“ 如果两只成功跳圆舞的奶牛有绳索相连,那她们可以同属一个组合.” 这句 ...
- wireshark in text mode: tshark
tshark -i <interface> -w "output.data" 抓到的数据可用wireshark打开查看.
- c# 将html添加进剪贴板(带格式)
调用: ClipboardHelper.CopyToClipboard("<h1>hello world</h1>", ""); /// ...
- js阻止事件冒泡和标签默认行为
////阻止事件冒泡函数和 // 阻止默认浏览器动作(W3C) 要一起使用效果好<a href="/Scripts/newfiber_js_lib/images/1.jpg" ...
- XmLHttpRequst下载Excel
//得到浏览器版本 myJqHelp.getBrowser = function () { var ua = window.navigator.userAgent; var isIE = !!wind ...
- asp.net正则表达式删除指定的HTML标签的代码
抓取某网页的数据后(比如描述),如果照原样显示的话,可能会因为它里面包含没有闭合的HTML标签而打乱了格式,也可能它里面用了比较让人 费解 的HTML标签,把预订的格式搅乱. 如果全盘删除里面的 HT ...
- 2015InfoQ软件大会技术记录
前述 参加infoq软件大会,最大的感触就是,互联网行业的技术发展日新月异:由市场痛点.用户痛点.开发痛点所驱动的技术变革更是遍地开花.新的技术新的思维也是层出不穷:大会中频频提到的高扩展高可用架构. ...