跳至主要内容

[Golang] 變數宣告(variables)

Basic Go Type

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

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

定義變數:

  • 使用 :=
  • 使用 var
// 讓 go 自動推論 price 的型別
var price = 3000 // 不常用,比較常用 :=
price := 3000 // 建議使用

// 如果希望指定明確的型別可以使用 type annotation
// var <name> <type> = <value>
var price float64 = 3000;

// 同時建立宣告多個變數
height, weight := 170.0, 70.0
var height, weight float64 = 170, 70

定義常數:

  • 使用 const
const ageOfAdult = 18

第一種宣告方式(最常用):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>
<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
// ...
)

參考