Gox语言中的映射类型(字典类型)及其操作-GX8.1

在Gox语言中,是用map类型来表示一般语言中的“字典”(dictionary)概念的,这与Go语言也是一致的。对map的声明、赋值和其他操作,我们来看看下面的例子。由于Gox语言默认采用Qlang语法引擎,因此这里按Qlang的语法来举例,后面不专门提到的话都是如此。

首先,对于一般的map的定义和基本操作,我们看看Qlang本身的文档,引自这里

a = {“a”: 1, “b”: 2, “c”: 3} // 得到 map[string]int 类型的对象
b = {“a”: 1, “b”, 2.3, “c”: 3} // 得到 map[string]float64 类型的对象
c = {1: “a”, 2: “b”, 3: “c”} // 得到 map[int]string 类型的对象
d = {“a”: “hello”, “b”: 2.0, “c”: true} // 得到 map[string]interface{} 类型的对象
e = make(map[string]int) // 创建一个空的 map[string]int 类型的对象
f = make(map[string]map[string]int) // 创建一个 map[string]map[string]int 类型的对象
g = map[string]int16{“a”: 1, “b”: 2} // 创建一个 map[string]int16 类型的对象

和 Go 语言类似,map 有如下内置的操作:

n = len(a) // 取 a 的元素个数
x = a[“b”] // 取 a map 中 key 为 “b” 的元素
x = a.b // 含义同上,但如果 “b” 元素不存在会 panic
a[“e”], a[“f”], a[“g”] = 4, 5, 6 // 同 Go 语言
a.e, a.f, a.g = 4, 5, 6 // 含义同 a[“e”], a[“f”], a[“g”] = 4, 5, 6
delete(a, “e”) // 删除 a map 中的 “e” 元素

需要注意的是,a[“b”] 的行为和 Go 语言中略有不同。在 Go 语言中,常见的范式是:

x := map[string]int{“a”: 1, “b”: 2}
a, ok := x[“a”] // 结果:a = 1, ok = true
if ok { // 判断a存在的逻辑

}
c, ok2 := x[“c”] // 结果:c = 0, ok2 = false
d := x[“d”] // 结果:d = 0

而在 qlang 中是这样的:

x = {“a”: 1, “b”: 2}
a = x[“a”] // 结果:a = 1
if a != undefined { // 判断a存在的逻辑

}
c = x[“c”] // 结果:c = undefined,注意不是0,也不是nil
d = x[“d”] // 结果:d = undefined,注意不是0,也不是nil

另外,与Go语言一样,遍历map中的数据时,顺序是不一定,这点需要注意。

下面是一个更多操作的例子,

// 默认的映射是map[string]interface{}类型的,相当于Gox中的map[string]var
a = {}
pv("a")

// 如果要键值非string,可以指定var或者其他的类型
a = map[var]var{}
pv("a")

// var类型支持各种值
a["Num"] = 3
a[5] = "abc"
a[-1] = true
a["ary"] = [1, "xyz", false]
a[false] = "not true"
a.Item1 = "item 1"

pv("a")

// 内置函数len用于取映射长度,即其中的键值对数
pl("length of a: %v", len(a))

// 可以用“.key”的方式来取map中对应的键值
pl("a.Num: %v", a.Num)

// 键值项可以直接进行计算和其他操作
a["Num"]++
println(a["Num"])

a[5]=a[5]+a[5]
a[5] = a[5][1:]
println(a[5])


// 直接定义以int类型作为键类型
c = map[int]string{}

c[3] = "3"
c[18] = "abc"
c[-198] = "true"

pv("c")

// 此时v是有值的
v = c[18]
if v == undefined {
	println("v:", v)
}

// 删除掉该项
delete(c, 18)

println("c:", c)

// 这样索引取键值会报错
// ok = c["b"] // will cause runtime error, since key should be int
// println(ok)

println("---")

// 遍历map的方法
for k, v = range a {
  println("[", k, "]:", v)
}



执行结果是:

a(map[string]interface {}): map[]
a(map[interface {}]interface {}): map[]
a(map[interface {}]interface {}): map[false:not true -1:true 5:abc Item1:item 1 Num:3 ary:[1 xyz false]]
length of a: 6
a.Num: 3
4
bcabc
c(map[int]string): map[-198:true 3:3 18:abc]
c: map[-198:true 3:3]
---
[ -1 ]: true
[ ary ]: [1 xyz false]
[ false ]: not true
[ Item1 ]: item 1
[ Num ]: 4
[ 5 ]: bcabc

代码很容易看懂,里面也有详尽的注释,再补充说明一下:

  • Gox语言中,可以用花括号直接来声明和建立一个map,此时默认对应于Go语言中的map[string]interface{}类型,而在Gox语言中,interface{}类型用var来表示,因此,也可以用“b = map[var]var{}”这样var的方式。两种方式效果是一样的;
  • 可以用“c = map[int]var{}”这种方法来指定key的类型,这样的话,如果以后用“c[“a”]”来用字符串作为key来引用c中数据项的话,会导致程序运行报错;
  • 在用map[var]var{}定义的map中,索引可以是任何类型的数据,所以代码开始对变量a以数字(甚至是负数)、字符串、布尔型变量来索引,都可以正常访问其中的数据项;
  • map中如果声明为var的数值也可以是任意类型,甚至可以是一个数组或者另一个map
  • 删除map中的某个数据项用delete内置函数;
  • 可以用“v = c[18]”这样的方式获取数值项,然后判断值是否为undefined来确认c中是否有索引为18的数值项;
  • 遍历map可以使用for循环;
  • 记得map也可以直接用“a = {“a”: 3, “b”: “abc”}”这样的方式直接定义。

猜你喜欢

转载自blog.csdn.net/weixin_41462458/article/details/107766620