前言
再看 the-way-to-go 的練習題,發現到他的結果跟我想的不一樣。
開始翻才發現漏掉的東西。
而這東西跟之前其他程式語言的想法不一樣。
正文
首先以C來講 在函數內修改全域變數,那全域變數會跟著改變。可看 全域變數和區域變數可視範圍 Variable Scope
C#跟VB也都是一樣,直接在函數修改全域變數的話,值會跟著改變。
但在Go裡面這個想法是錯的,
在the-way-to-go上面有一段話
儘管變量的標識符必須是唯一的,但你可以在某個代碼塊的內層代碼塊中使用相同名稱的變量,則此時外部的同名變量將會暫時隱藏(結束內部代碼塊的執行後隱藏的外部同名變量又會出現,而內部同名變量則被釋放),你任何的操作都只會影響內部代碼塊的局部變量。
簡單來說就是,
區域變數 優先性 >全域變數,就算名稱一樣,也是以區域變數為主。
再來看下面這段程式碼
package main
var a = "G"
func main() {
n()
m()
n()
}
func n() { print(a) }
func m() {
a := "O"
print(a)
}
應該就會明白答案是什麼了。
如果要直接改全域變數的話,則直接將值取代func q() {
a = "O"
println(a)
}
再來看另外一個,如果在函數內呼叫函數,
那此時的變數就會改呼叫全域變數了。
package main
var a string
func main() {
a = "G"
print(a)
f1()
}
func f1() {
a := "O"
print(a)
f2()
}
func f2() {
print(a)
}
有時候搞不清楚是全域還是區域變數的話,
可以考慮用vs code看一下(Fig.1),能夠很清楚的知道這個時候是全域還是區域。
(Fig.1)
ref.
golang基礎學習---Go 語言變數作用域
0 意見:
張貼留言