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 <nil>]

可以看出,核心要訣是,Gox語言中的函數參數,在函數體內是局部的,也就是說如果函數f有參數a,這時候如果外部還有一個全局變量a,此時這兩個變量是不同的,互不干涉。因此,我們可以在定義函數時就定義一個形式參數變量,然後在調用該函數時在該參數位置傳入一個新建的空map(字典)類型的變量,如同本例中cal函數的參數c一樣,這樣就不會產生全局變量衝突的問題了。

注意:

  • 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語言的學習指南和實際應用實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章