Pages - Menu

2020年2月24日 星期一

[Go]撞牆筆記篇 PartIII - 全域變數

前言

再看 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 語言變數作用域





沒有留言:

張貼留言