Go起步走 - 變數宣告


Go的變數宣告有數種,要注意的是由於Go是強型別語言,所以型別都是固定的,就算不宣告型別,也必須要有初始值,讓compiler來判斷這個變數的預設值是什麼型別。變數不經過宣告便無法使用,跟Ruby那類比較自由的語言不同。

以下使用Go最常見的fmt.Println()來顯示結果,相當於JavaScript的console.log()或Ruby的puts

一般變數 var

var name string
var name string = "John"
var name = "John"
name := "John"

最後一種寫法最簡單,因此也最常見。

多重變數宣告:

var a,b,c int
var a,b,c int = 1,2,3
var a,b,c = 1,2,3

用括弧的方式宣告:

var (
  name = "John"
  a, b = 1, 2
)

在Go當中,只要重複的宣告方式,都可以用()涵蓋起來,包括import和下面的const都一樣。

常數 const

常數的宣告與var相同,不一定第一個字母要大寫,但由於強調其重要性,大部分還是會採用大寫。除此之外,宣告方式與一般變數相同。

const PI = 3.14
const Language = "Go"

指標 Pointer

Pointer是copy和reference的概念,也就是說原變數的改變也會影響到pointer的值。

在宣告pointer時,有兩個符號需要記得:

&代表dereferencing,在變數前面加上這個符號,會顯示記憶體的位置。
*代表indirecting,在reference變數前面加上這個符號,會顯示其代表的值。

講起來有點玄,直接看範例:

var (
  hello = "Hello World!"
  // 宣告pointer時,型別上要加上*符號,後方reference的變數要加上&符號
  greeting *string = &hello
)

fmt.Println(*greeting)
// => "Hello World!"
fmt.Println(greeting)
// => 0x1040a120
fmt.Println(hello)
// => "Hello World!"
fmt.Println(&hello)
// => 0x1040a120

如果不加上*符號,pointer變數會回傳記憶體位置。

簡單一點的宣告也可以簡化成:

var greeting = &hello

而pointer最重要的就是直接作為reference來讀取或修改原本的值:

*greeting = "changed value"
fmt.Println(hello)
// => "changed value"

如果不是用pointer來指派變數的話,改變另一個變數就不會對原本的變數有任何影響。

var salute = hello
salute = "changed value"
fmt.Println(hello)
// => "Hello World!"

個人過去學的是Javascript和Ruby,剛切換到Go非常不習慣,光是變數宣告就有蠻大的差異,特此筆記!

參考資料

A Tour of Go對於Pointer的說明