iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
0
Software Development

學習Go系列 第 7

Go day 7 (init & scope)

  • 分享至 

  • xImage
  •  

init

init function 可以用來對該程式進行一些初始化的動作.

sumutil.go

透過 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

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

在宣告變數時,也要注意宣告的範圍 (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
}


上一篇
Go day 6 (new & lifecycle & type)
下一篇
Go day 8 (basic types)
系列文
學習Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言