init function 可以用來對該程式進行一些初始化的動作.
透過 init 初始化變數 sum 為 10
package mymath
var sum int
func init() {
sum = 10
}
func GetSum() int {
return sum
}
func Add(num int) int {
sum += num
return sum
}
func Sub(num int) int {
sum -= num
return sum
}
目錄結構 :
goHello
-src
-util
-mymath
sumutil.go
-practice
example.go
根據上面放置的目錄結構 import sumutil.go 的 package 是 util/mymath
package main
import (
"fmt"
"util/mymath"
)
func main() {
fmt.Println(mymath.GetSum()) // 10
fmt.Println(mymath.Add(10)) // 20
fmt.Println(mymath.Sub(5)) // 15
fmt.Println(mymath.GetSum()) // 15
}
在宣告變數時,也要注意宣告的範圍 (scope) 也就是一個程式文字區域,在 compile 時就會先檢查.
會從最內層的區塊先開始查詢到全域的區塊,如果所有的範圍都找不到的話就會出現 undefined.
package main
import (
"fmt"
)
var x string // 變數 x : 1
func init() {
x = "sam!"
fmt.Println(x)
}
func main() {
x := "daniel!" // 變數 x : 2
for i := 0; i < len(x); i++ {
x := x[i] // 變數 x : 3
if x != '!' {
x := x + 'A' - 'a' // 變數 x : 4
fmt.Printf("%c , ", x)
}
fmt.Println(x)
// fmt.Println(y) // undefined: y
}
fmt.Println(x)
}
在上面的範例裡 4 個不同變數 x 都出現在不同的程式區塊裡,
而變數 i 是存在 for 迴圈的隱含區塊裡.
執行結果 :
sam!
D , 100
A , 97
N , 110
I , 105
E , 101
L , 108
33
daniel!
for , if , switch 除了本體的程式區塊之外,還有另外的隱含區塊
package main
import (
"fmt"
)
func retx() int {
return 3
}
func rety() int {
return 5
}
func main() {
if x := retx(); x == 3 {
fmt.Println(x) //本體程式區塊
} else if y := rety(); x == y { // 隱含區塊
fmt.Println(x, y)
} else {
fmt.Println(x, y)
}
//fmt.Println(x, y) // compiler error undefined: x, y
}