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

* 注:由于0.988版本后,为了减少不必要的文件体积,Gox已经放弃了其他脚本引擎,仅支持Qlang引擎,因此本文中的内容已经无效,仅留作对旧版本的参考。

在Gox语言中,是用map类型来表示一般语言中的“字典”(dictionary)概念的,这与Go语言也是一致的。对map的声明、赋值和其他操作,我们来看看下面的例子。

首先,对于一般的map的定义,可以这样,

map1 = {"first": "item1", "second": 2.8}

for k in keys(map1 ) {
  println(map1[k])
}

执行结果是这样:

2.8
item1

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

下面是一个更完整的例子,

a = {}

a["Num"] = 3
a[5] = "abc"
a[-1] = true
a["ary"] = [1, "xyz", false]
a[false] = "not true"
a.Item1 = "item 1"

pv("a")

pl("length of a: %v", len(a))
pl("a.Num: %v", a.Num)

a["Num"]++
println(a["Num"])

a[5]*=2
a[5] = a[5] * 3 
println(a[5])

b = map[interface]interface{}

pv("b")

c = map[int]interface{}

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

pv("c")

v, ok = c[18]

if ok {
    println("v:", v)
}

delete(c, 18)

println("c:", c)

_, ok = c["b"]
println(ok)

println("---")

for k in keys(a) {
  println("[", k, "]:", a[k])
}

println("---")

for k, v in a {
    pl("[%v] %v", k, v)
}

执行结果是:

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
abcabcabcabcabcabc
b(map[interface {}]interface {}): map[]
c(map[int]interface {}): map[-198:true 3:3 18:abc]
v: abc
c: map[-198:true 3:3]
false
---
[ Num ]: 4
[ 5 ]: abcabcabcabcabcabc
[ -1 ]: true
[ ary ]: [1 xyz false]
[ false ]: not true
[ Item1 ]: item 1
---
[Num] 4
[5] abcabcabcabcabcabc
[-1] true
[ary] [1 xyz false]
[false] not true
[Item1] item 1

代码很容易看懂,需要说明的是:

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

推荐阅读更多精彩内容