Skip to main content

[Golang] 變數宣告(variables)

Basic Go Type#

Go 屬於強型別(Static Types)的語言,其中常見的基本型別包含 bool, string, int, float64, map

變數宣告時變數名稱放前面 變數型別放後面

第一種宣告方式(最常用):short declaration#

使用 := 宣告,表示之前沒有進行宣告過。這是在 go 中最常使用的變數宣告的方式,因為它很簡潔。但因為在 package scope 的變數都是以 keyword 作為開頭,因此不能使用縮寫的方式定義變數(foo := bar),只能在 function 中使用,具有區域性(local variable):

// 第一種宣告方式
function main() {
foo := "Hello"
bar := 100
// 也可以簡寫成
foo, bar := "Hello", 100
}
// 等同於
function main() {
var foo string
foo = "Hello"
}

第二種宣告方式:variable declaration#

使用時機主要是:

  • 當你不知道變數的起始值
  • 需要在 package scope 宣告變數
  • 當為了程式的閱讀性,將變數組織在一起時

⚠️ 留意:在 package scope 宣告的變數會一直保存在記憶體中,直到程式結束才被釋放,因此應該減少在 package scopes 宣告變數

// 第二種宣告方式,在 main 外面宣告(全域變數),並在 main 內賦值
var foo string
var bar int
// 可以簡寫成
var (
foo string
bar int
)
function main() {
foo = "Hello"
bar = 100
}

⚠️ 不建議把變數宣告在全域環境

如果變數型別一樣的話,也可以簡寫成這樣:

func main() {
var c, python, java bool
fmt.Println(c, python, java)
}

第三種宣告方式#

直接宣告並賦值:

// 第三種宣告方式,直接賦值
var (
foo string = "Hello"
bar int = 100
)

三種方式是一樣的#

下面這兩種寫法是完全一樣的:

var <name> <type> = <value>
var <name> := <value>
// var card string = "Ace of Spades"
card := "Ace of Spades"
// var pi float = 3.14
pi := 3.14

只有在宣告變數的時候可以使用 := 的寫法,如果要重新賦值的話只需要使用 =

注意事項#

錯誤:重複宣告變數#

// 錯誤:重複宣告變數
paperColor := "Green"
paperColor := "Blue"

正確:我們可以在 main 函式外宣告變數,但無法在 main 函式外賦值#

// 正確:我們可以在 main 函式外宣告變數,但無法在 main 函式外賦值
package main
import "fmt"
var deckSize int
func main() {
deckSize = 50
fmt.Println(deckSize)
}

錯誤:無法在 main 函式外賦值#

// 錯誤:但無法在 main 函式外賦值
package main
import "fmt"
// syntax error: non-declaration statement outside function body
deckSize := 20
func main() {
fmt.Println(deckSize)
}

錯誤:變數需要先宣告完才能使用#

// 錯誤:變數需要先宣告完才能使用
package main
import "fmt"
func main() {
deckSize = 52 // undefined: deckSize
fmt.Println(deckSize) // undefined: deckSize
}

常數(constant)#

keywords: iota#

使用 :=var 所宣告的會是變數,若需要宣告常數,需要使用 const

const (
Monday = 1
Tuesday = 2
Wednesday = 3
// ...
)
// 可以簡寫成
// iota 預設從 0 開始,後面的變數自動加一
const (
Monday = iota + 1
Tuesday
Wednesday
// ...
)

參考#

Last updated on