Gox语言中的全局变量与局部变量-GX52

Gox语言作为一门脚本语言,为了便捷,并适当提升性能,目前只支持全局变量。这有一定的方便性,例如,常见语言中类似下面的问题就将不复存在:

a = true

var sqlStr string

if a {
  sqlStr = "insert into table1 (id, name) values(12, 'is')"
} else {
  sqlStr = "insert into table1 (id, name) values(12, 'not')"
}

finalStr = strings.Trim(sqlSqr)

println(finalStr)

一般的强类型语言必须先声明sqlStr这个变量,并且由于变量的作用范围限制于块级代码中,因此,如果不用var sqlStr string来事先声明变量sqlStr,后面使用sqlStr时,在if语句块中赋的值将无效,实际上,如果这样,该段代码也无法编译通过。而在Gox语言中,则可以直接使用,

a = true

if a {
  sqlStr = "insert into table1 (id, name) values(12, 'is')"
} else {
  sqlStr = "insert into table1 (id, name) values(12, 'not')"
}

finalStr = strings.Trim(sqlSqr)

println(finalStr)

结果应该是正确的,老程序员应该都能体会这个带来的好处。

但这也带来一些不便,如果在做一些稍大型软件时,如果没有局部变量,可能会带来变量名冲突导致意料之外的错误,因为只有全局变量意味着整个代码中不能有同名的变量表示不同内容的情况。尤其是在并发编程时,一个并发调用的函数,其中的变量如果都是全局的,更有可能产生冲突。这时,可以用下面的方法避免:

a = 1

fn() {
    a = 2
}()

println(a)

b = "I'm fine."

fn(b) {
    b = "Hi!" + b
    println(b)
}(b)

println(b)

c = "abcd"

func cal(c, d) {
    c.attr1 = [1, 2, 3]
    c.attr1 = append(c.attr1, 123)
    c.attr1 = append(c.attr1, d)

    c.attr2 = "That's nice."
    c.attr3 = {}

    c.attr3.a1 = 2.6

    println(c)
}

cal({}, 1)

cal({}, 5)

cal({}, 10)

println(c)

上面这段代码的运行结果是:

2
Hi!I'm fine.
I'm fine.
map[attr1:[1 2 3 123 1] attr2:That's nice. attr3:map[a1:2.6]]
map[attr1:[1 2 3 123 5] attr2:That's nice. attr3:map[a1:2.6]]
map[attr1:[1 2 3 123 10] attr2:That's nice. attr3:map[a1:2.6]]
abcd
[5 ]

可以看出,核心要诀是,Gox语言中的函数参数,在函数体内是局部的,也就是说如果函数f有参数a,这时候如果外部还有一个全局变量a,此时这两个变量是不同的,互不干涉。因此,我们可以在定义函数时就定义一个形式参数变量,然后在调用该函数时在该参数位置传入一个新建的空map(字典)类型的变量,如同本例中cal函数的参数c一样,这样就不会产生全局变量冲突的问题了。

更简单的方法如下:

func f1() {
    a = 1.1
    for {
        pl("f1: %v", a)

        sleep(1.0)
    }
}

func f2() {
    a
    for {
        a = "A"
        pl("f2: %v", a)

        sleep(0.7)
    }
}

a

go f1()
go f2()

a = 0
for {
    pl("f0: %v", a)

    sleep(0.3)
}

这段代码的运行输出是:

f0: 0
f2: A
f1: 1.1
f0: 0
f0: 0
f2: A
f0: 0
f1: 0
f0: 0
f2: A
f0: 0
f0: 0
f1: 0
f2: A
f0: 0
f0: 0
f0: 0
f2: A
f1: A
f0: 0
f0: 0
f2: A
f0: 0
f0: 0
f1: 0
f2: A

可以看到,函数f1中的a和主函数中的a是同一个变量,而函数f2中的则不是,说明如果要声明一个函数中的局部变量,直接在函数体代码中先用变量名作为单独的语句声明一下就可以了。

注意:

  • Gox语言是脱胎于Go语言(Golang)的开源脚本语言,解释执行,但相比Go语言更贴近高级语言,语法硬性限制也少一些;是一门偏向快速应用的语言,也可以说是一个集成工具;

  • Gox语言主要优势有三点:

    • 第一,Gox语言本身只有一个可执行文件,绿色免配置,下载即可使用,无需安装Go语言环境,无需编译,非常适合快速制作原型以及云服务器上的远程开发;
    • 第二,Gox中可以直接使用绝大多数Go语言标准库中的对象和方法函数,也内置了很多常用、优秀的第三方库,充分发挥Go语言多年积累的资源优势;
    • 第三,与很多其他主流语言不同,Gox语言着力解决了GUI图形界面编程的问题,内置了基于Fyne、Sciter的多套图形界面编程库,直接可以进行快捷高效的图形界面开发(Sciter只需分别下载一个动态链接库文件,执行和分发时附带上即可),特别适合编写演示原型系统。

作为脚本语言,Gox语言性能肯定不如Go语言这样的编译型语言快,但由于Gox语言与Go语言的紧密联系,Gox语言编写的脚本可以很容易的改写成Go语言代码,编译执行后就可以发挥Go语言的速度优势了。因此,Gox语言也比较适合做初期的Go语言调试。

Gox的官网在这里,也可以在浏览器搜索引擎中直接搜索“gox语言”,Github页面在这里,在这里可以看到很多Gox语言的学习指南和实际应用实例。

你可能感兴趣的:(Gox语言中的全局变量与局部变量-GX52)