變數的宣告其實也是門學問,很多新手會想說"全部都宣告全域變數就好了啊",但為了安全性、可讀性以及有效的執行最小權限原則(即為要用到的變數才看的到,用不到的就不需要看到),這篇就仔細地跟大家講解
同一個package可以視為程式碼都在同一個檔案內
package main
var x = 5
package main
import "fmt"
func main() {
fmt.Println(x) // 5
}
雖然沒宣告,但從上一個檔案可以看到x = 5
如同上一篇提到,在package中大小寫的區別會造成exported和unexported:
person/personName.go
package person
var MyName = "Micheal" // exported
var yourName = "Tony" // unexported
package main
import {
"fmt"
"github.com/TroyCode/GoIn30Days/day6/person"
}
func main {
fmt.Println(person.MyName) // Micheal
fmt.Println(person.yourName) // 錯誤,因為是unexported
}
括號內的變數只要是同樣在括號內都能使用,括號外則不行
package main
import "fmt"
func main() {
x := 1
foo() // 錯誤,因為x屬於main中的變數
}
func foo() {
fmt.Println(x)
}
這個比較猛,意思就是在程式中都能讀到他,每的地方的操作都會改變他的值
package main
import "fmt"
var x = 0
func xPlus() {
x++
}
func main() {
x++ // x = 1
xPuls() // x = 2
}
宣告的順序當然也很重要,宣告之後才可用
package main
import "fmt"
func main() {
x := 5
fmt.Println(x)
fmt.Println(y) // 這樣是找不到y的
y := 10
}
這樣用是不會出錯,但是不建議,日後debug可能造成麻煩
package main
import "fmt"
func foo(x int) int {
return x + 1
}
func main() {
foo := foo(1) // 第一個foo是變數,第二個是函式
}