[Golang] 資料型別 Data Types
常見的型別
Basic Types
int
:沒有小數點的數字,例如-5
、10
。float64
:有小數點的數字, 例如-5.2
、12.32
。string
bool
uint
:非負整數(unsigned integer),例如,0
、10
int32
:32 位元(32-bit)的整數,介於-2,147,483,648
到2,147,483,647
間rune
:int32
的 alias,用來表示 Unicode 的碼點(code point)uint32
:32 位元的非負整數,介於0
到4,294,967,295
間int64
:64 位元的整數,介於-9,223,372,036,854,775,808
到9,223,372,036,854,775,807
間
Null Value
在 golang 中,幫某一變數指定型別後,卻沒有賦值時,會有一個預設的 value,稱作 Null Value
,類似預設值的概念。例如
int
的 null value 是0
float64
=>0.0
string
=>""
bool
=>false
Value vs Reference Types
參考資料
Go (Golang) Tutorial #13 - Pass By Value @ TheNet Ninja
資訊
在 Go 中都是 pass by value,但某些型別會表現得類似 pass by reference(Reference Types),例如 slice,它在複製的時候,實際上是複製了它的 pointer,這就是為什麼有些型別會表現的類似 pass by reference。
- Non-Pointer Values:string, int, float, boolean, array, struct
- Reference Type (pointer wrapper values): slice, map, function, channel
在 Golang 中,雖然所有資料結構都是 Pass by value,但當碰到 slices、maps、functions 時,雖然它還是會 copy 一份新的,但實際上,它 copy 的是一個 pointer,所以即使它依然是 copy by value,但對這個變數進行修改時,會修改到 pointer 背後實際所指稱到的記憶體位址,進而使得在操作這些資料結構時,會感覺像是 Pass by Reference:
func updateMenu(y map[string]float64) {
// y 一樣會時 copy 一個新的變數,但它是 pointer
// 實際上會指稱到背後相同的記憶體位址
y["cake"] = 2.99
}
func main() {
menu := map[string]float64{
"apple": 5.95,
"banana": 3.99,
}
updateMenu(menu)
fmt.Println(menu) // map[apple:5.95 banana:3.99 cake:2.99]
}
Concrete vs Interface Type
- concrete type 指的是可以被賦值的型別,例如,map, struct, int, string、一些自訂的 type。
- interface type 無法直接賦值的型別
Zero values
Zero values @ A Tour of Gp
在 GO 中,如果宣告了某個變數但沒有賦值的話,會使用 zero value:
Data Type | Zero Value |
---|---|
int | 0 |
float64 | 0 |
bool | false |
String | "" |
型別轉換(Type Conversion)
T(v)
這種方式,可以把 v
的值轉換成 T
這個型別。舉例來說:
func main() {
i := 42 // int
f := float64(i) // int 轉成 float64
u := uint(f) // float 64 轉成 uint
fmt.Println(i, f, u)
}
func main() {
hello := "Hello World"
helloSlice := string2ByteSlice(hello)
fmt.Println(helloSlice)
helloString := byteSlice2String(helloSlice)
fmt.Println(helloString)
}
// byte slice 轉成 string
func byteSlice2String(b []byte) string {
return string(b)
}
// string 轉成 byte slice
func string2ByteSlice(s string) []byte {
return []byte(s)
}
自定義資料型別
// 定義 cards 這個型別,它的本質是 slice of strings
type cards []string
// 定義 person 這個型別,它的本質是 struct
type person struct {
firstName string
lastName string
}
透過 function receiver 為該 type 添加方法
我們可以針對自定義的 data type 透過 function receiver 去建立方法,可以參考「[Golang] 函式 function」中的內容。