[Go]字典(map)的操作和约束
字典(map)存储的是键值对(key-value pair,一个键值对代表了一对键和值。一个键和一个值分别代表了一个从属于某一类型的独立值,把它们两个捆绑在一起就是键值对,也称“键-元素对”)的集合
Go语言的字典类型其是由一个哈希表特定实现的,在这个实现中,键和元素最大不同在于,前者的类型是受限的,后者却可以是任何类型
package main import (
"fmt"
) func main() {
aMap := map[string]int{
"one": ,
"two": ,
"three": ,
}
k := "two"
v, ok := aMap[k]
if ok{
fmt.Printf("THe element of key %q: %d\n", k, v)
}else {
fmt.Println("Not found!")
}
}
在哈希表中查找某个键值对应的那个元素值,需要先把键值作为参数传给这个哈希表,哈希表会先用哈希函数把键值转换为哈希值。哈希值通常是一个无符号的整数,一个哈希表会持有一定数量的桶(bucket,哈希桶),这些哈希桶会均匀地存储其所属哈希表收纳的那些键值对。哈希表会先用这个键的哈希值的低几位去定位到一个哈希桶,然后再到这个哈希桶中查找这个键,由于键值对是捆绑在一起存储的,所以一旦找到了键,就一定能找到对应的元素值。随后哈希表就会把相应的元素值作为结果返回
1、字典的键类型不能是哪些类型?
Go语言规范规定,在键类型的值之间必须可以施加操作符==和!=,即键类型的值必须要支持判等操作。由于函数类型、字典类型、切片类型不支持判等操作,所以字典的键类型不能是这些类型。
不建议使用高级数据类型(数组、接口、结构体)作为字典的键类型,它们的值求哈希较慢,并且它们的值中存在变数(可以修改其中的元素值),还需要对其内部元素类型进行判断
如键的类型是数组类型,那么还要确保该类型的元素类型不是函数类型、字典类型或切片类型
2、应该优先考虑哪些类型作为字典的键类型?
求哈希和判等操作的速度越快,对应的类型就越适合作为键类型
宽度(单个值需要占用的字节数,如bool、int8的字节宽度都是1)越小的类型速度通常越快。对高级类型,如数组类型的值求哈希实际上是依次求得它的每个元素的哈希值并进行合并
因此优先选用数值类型和指针类型作为字典的键类型
3、在值为nil的字典上执行读操作会成功吗?那写操作呢?
由于字典是引用类型,所以当我们仅声明而不初始化一个字典类型的变量的时候,它的值会是nil
除添加键值对,在一个值为nil的字典上做任何操作都不会引起错误。当试图在一个值为nil的字典中添加键值对时,会抛出panic
[Go]字典(map)的操作和约束的更多相关文章
- Python复习笔记-字典和文件操作
抽时间回顾2年前自己做过的python工具,突然感觉不像自己写的,看来好久没用过python的字典和文件操作了,查询资料和网页,整理如下: 一.字典 键值对的集合(map) 字典是以大括号“{}”包围 ...
- Python3 字典(map)
ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...
- python 字典的常见操作
字典 字典的增删改查 字典的创建方式: # 创建字典类型 info = { 'name':'李白', ', 'sex':'男' } msg = { 'user01':'Longzeluola', 'u ...
- python数据类型:字典dict常用操作
字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的: Key: 不可变(可哈希)的数据类型.并且键是唯一的,不重复的. Value:任意数据(int,str,boo ...
- python(二)——list、字典、字符串操作
列表——list 假设一种场景,想要存班里所有同学的名字,那应该拿什么存呢? 我们可以拿一个字符串去存,例如: stus = "s1,s2,s3,s4,s5……sn" 那我们要从里 ...
- Objective-C:NSDectionary字典的常见操作
NSDectionary字典:它是一个存储键值的容器,每一个键key都对应着一个值value,可以通过键key一次性找到目标值value,这是一个比较好的存储器,相比于数组而言,它明显提高了查询效率. ...
- [PY3]——内置数据结构(7)——字典及其常用操作
字典及其常用操作Xmind图 关于字典 字典是一种key-value结构 字典是无序的 字典的定义 # {}大括号可以直接定义一个空字典 In [1]: d={};type(d) Out[1]: di ...
- python3.0 day02 列表、元组 、字典、字符串操作
1.列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作,类似于其他语言中的数组. 定义列表 names = ['Lioa',"Tenglan ...
- dict字典;dict的操作
一.字典: 1. 字典 dict 用{}来表示 键值对数据 {key:value} 唯一性 键 都必须是可哈希的 不可变的数据类型就可以当做字典中的键 值 没有任何限制 1.1 字典的创建: ...
- python之字典的相关操作
一.什么是字典 dict 用{}表示,用来存放键值对数据 {key:value} 键:具有唯一性,不能重复,不可变 必须是可哈希的(不可变的数据类型) 字典是无序的,没有索引 值: 没有任何限制 已知 ...
随机推荐
- 142 Linked List Cycle II 环形链表 II
给一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.说明:不应修改给定的链表.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/proble ...
- Apache Cordova
http://cordova.apache.org/ Apache Cordova is a platformfor building native mobile applications using ...
- 关于<meta NAME="keywords" CONTENT="">
昨天终于以实习身份入职一家小创业公司,今天让我多看看别人的网页怎么写的,发现了一个以前都没关注过的东西. <meta name="keywords" content=&quo ...
- docker上配置nginx负载均衡
采用ubuntu系统,docker安装自行百度 1.安装tomcat docker run -d -p : tomcat docker run -d -p : tomcat 安装两个实例,端口分别为8 ...
- 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 这个教程的前两篇文章,介绍了如何 ...
- 如何开发 Laravel 扩展包并发布到 Composer
如何开发 Laravel 扩展包并发布到 Composer 发布于 2019-01-22 cxp1539 1074 Vie 开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...
- Vsphere中ESXi主机ssh开启的三种方法
ESXi 5.5是直接安装在物理主机上的一个虚拟机系统,本质上是一个Linux系统. 平时可以通过VMware Client端或者VMware vCenter进行管理,但对于一些特殊的VMware命令 ...
- 跑RFCN
按照这个来http://blog.csdn.net/sinat_30071459/article/details/53202977
- 0xc000007b——应用程序无法正常启动
0xc000007b——应用程序无法正常启动 原因:缺少exe程序启动所需要的DLL.
- TUM好用的工具
https://vision.in.tum.de/data/datasets/rgbd-dataset/tools?tdsourcetag=s_pctim_aiomsg