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非常不習慣,光是變數宣告就有蠻大的差異,特此筆記!