iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
自我挑戰組

重新學 Go 30 天系列 第 4

[GO30] Day4 GO 型別

  • 分享至 

  • xImage
  •  

以下為 Go 中最常使用的型別,這裡要注意的是宣告變數時,變數會有型別的預設值

int / int64

intint64 的預設值為 0

( int 有可能是 int32 或 int64,依作業系統而定 )

var a int
var b int64
fmt.Println(a == 0) // true
fmt.Println(b == 0) // true

float64

float64 預設值為 0

var a float64
fmt.Println(a == 0) // true

bool

bool 預設值為 false ( 最常碰到的雷之一 )

var a bool
fmt.Println(a == false) // true

string

string 預設值為空字串

var a string
fmt.Println(a == "") // true

slice

slice 的預設值為 nil,slice 通常作為 array 來操作

var slice []int
fmt.Println(slice == nil) // true

如果想建立一個非 nil 的 slice,可以使用 make 函式建立

var slice = make([]int, 0)
fmt.Println(slice)

make 函式的參數為 (型別, 長度, 容量),其中型別為欲建立的 slice 的元素型別,長度為欲建立的 slice 的初始長度,容量為欲建立的 slice 的初始容量。例如:

var slice = make([]int, 5, 10)
fmt.Println(slice) // [0 0 0 0 0]

這樣就建立了一個初始長度為 5,容量為 10 的整數 slice。

append 函式用於在 slice 的末尾添加元素,並返回新的 slice。如果原始 slice 的容量不足以容納新元素,append 函式會自動擴展容量。

var slice = []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice) // [1 2 3 4]

append 函式還可以一次添加多個元素:

var slice = []int{1, 2, 3}
slice = append(slice, 4, 5, 6)
fmt.Println(slice) // [1 2 3 4 5 6]

注意,append 函式返回的是新的 slice,所以必須將其賦值給原始 slice。

map

map 的預設值為 nilmap 是一種 key, value 的集合。可以使用 make 函式來建立非 nilmap

var m map[string]int
fmt.Println(m == nil) // true

m = make(map[string]int)
fmt.Println(m) // map[]

struct

和 class 的概念類似,可以使用 type 關鍵字來定義 struct

type Person struct {
    Name string
    Age  int
}

var p Person
p.Name = "John"
p.Age = 30
fmt.Println(p) // {John 30}

interface

interface 可定義一組方法的抽象型別,實現多型性。介面的預設值為nil

type Person interface {
	eat()
}

var p Person
fmt.Println(p == nil) // true

通常 interface 和 struct 會搭配使用,只要 struct 有實作 interface 上的方法,就可以將該 struct 的實例賦值給 interface 變數。例如:

type Person interface {
	PrintName()
}

// ===

type User struct {
	Name string
}

func (p *User) PrintName() {
	fmt.Println(p.Name)
}

func main() {
	var p Person
	p = &User{
		Name: "John",
	}
	p.PrintName() // John
}

上一篇
[GO30] Day3 GO 變數宣告
下一篇
[GO30] Day5 GO 指標
系列文
重新學 Go 30 天10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言