map
在不同语言中, "map"有许多不同的名称, Z1h中的"map"对应以下语言各自对相同概念的称呼是类似的:
语言 | 名称 | 特性或主要差异 |
---|---|---|
Z1h | map | 无序、线程不安全 |
Z1h | Map | 无序、线程安全 |
Go | map[string]interface{} | 不允许通过s.key=value进行赋值,只允许s["key"]进行操作 |
Python | dict | 不允许通过s.key=value进行赋值,只允许s["key"]进行操作 |
JavaScript | Object | |
Java | HashMap |
只能用方法进行操作 |
Objective-C | NSMutableDictionary | |
C# | Dictionary |
声明
创建一个map的方法有:
// 线程不安全的map
// 创建一个空的map
m1 = {}
// 初始化了常量内容
m2 = {"name": "z"}
// 初始化时, key可以省略字符串标识('、"、\`)
m3 = {name: "z"}
// 初始化时, key与变量名相同时
m4 = {m3}
// 线程安全的map
// 初始化一个多线程安全的map
m5 = new(sync.Map)
// 初始化一个有限制key个数、自动淘汰冷门键的线程安全map
m6 = new("weak")
m7 = new("weak", 2) // key个数限制最多为2, 超过2个时触发淘汰
// 初始化一个有过期淘汰机制的线程安全map
m8 = new("expire")
m9 = new("expire", 3) // key的默认过期时间为3秒
m10 = new("expire", new("weak")) // 同时执行两个淘汰策略
此外还有使用方法进行生成
// 从字符串转换成map
m11 = JSON.parse(`{"name": "zzz"}`)
赋值
采用以下几种方式可以进行赋值
map变量名
.key
=value
map变量名
[key] =value
示例:
m = {
name: "z",
};
m.age = 18; // 设置age
m["tall"] = 171; // 设置tall
key = "weight";
m[key] = 61.5; // 设置weight
print(m);
上例将会输出
{"age":18,"name":"z","tall":171,"weight":61.5}
取值
用以下几种方法可以从map取值
map变量名
.key
map变量名
[key]- {key1, key2} =
变量名
承接上文的环境:
print("名称:", m["name"]);
print("身高:", m.tall);
{age, weight} = m;
print(`年龄: ${age}, 体重: ${weight}`);
上例将会输出
名称: z
身高: 171
年龄: 18, 体重: 61.5
可选链
如果尝试对map进行取值时, key不存在, 会抛出Kind xxx doesn't have key [xxx]
的错误, 此时有两种方式可以判断、取值
- has(
map对象
,key
) // 返回bool类型 map对象
?.key
// 如果key不存在,返回nilmap对象
?[key变量]
// 如果key不存在,返回nil
承接上文的环境:
print(has(m, "name")); // true
print(m?.name); // z
print(has(m, "gender")); // false
print(m?.gender); // null
print(m?["score"]); // null
可选链的更多说明可以参考文档运算符
后置递增递增、递减
对map的某个key进行递增, 例如
m.age++; // 19
m["age"]++ // 20
m.weight--; // 60.5
m["weight"]--; // 59.5
如果是线程不安全的map, 可以对不存在的key进行递增以便记数
m.score++; // 1
m["score"]++ // 2
移除key
线程不安全的map的删除方法如下:
del(m, "age");
key = "score";
del(m, key);
线程安全的Map的删除方法如下:
m.Delete("age");
key = "score";
m.Delete("age");
序列化
以下方法可以将线程不安全的map转换成字符串
- JSON.stringify(m);
- string(m);
获取key列表
Object.keys(m)
获取value列表
Object.values(m)
遍历
// 方式1
for (k, v in m) {
print(`Key = ${k}, Value = ${v}`)
};
// 方式2
Object.keys(m).forEach(k => {
print(`Key = ${k}, Value = ${m[k]}`)
});