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不存在,返回nil - map对象 ? [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]}`) });