指標是一種類型的分類(同string , int...),一個指標可以儲存一個記憶體位址,在每次建立指標時,他都會有一個對應的類型,像是*int
可以解讀為,一個指標指向int的指標類型
var <變數> *T
T為任意型別,類別T被稱為指標類型的base type
type Point *int // point為一個指標類型,並且base type為int
type PT *Point // PT為一個指標類型,並且base type 為Point
new()
: 我們可以用內建函數new來為任何類型的值開闢一塊內存並將此內存區塊的起始地址做為此值的位址回傳。
somevar := new(<型別>)
零值
"零值"是指變量在宣告但還未明確賦值時的默認值。
以下是 Go 語言中不同類型變量的零值表格:
變量類型 | 零值 |
---|
數值類型(如 int, float 等) | 0 |
字符串類型(string) | "" (空字符串) |
布林類型(bool) | false |
指針或參考類型(如 *int, *string 等) | nil |
結構類型(struct) | 每個成員的零值 |
陣列類型(如 [...]Type 等) | 每個元素的零值 |
切片(slice) | nil |
映射(map) | nil |
通道(chan) | nil |
注意:對於指針或參考類型,nil 意味著該指針未指向任何值。對於切片、映射和通道類型,nil 則表示該類型的變量未被初始化。
<變數1> := &<變數2>
package main
import "fmt"
func main() {
// 使用new創建一個int類型的指標,並初始化為其零值
pointer1 := new(int)
fmt.Println(pointer1) // 輸出指標的位址
fmt.Println(*pointer1) // 輸出指標所指向的值,此時為int類型的零值0
// 定義一個int變量
var num int = 10
// 使用&取得num的位址,得到一個指向num的指標
pointer2 := &num
fmt.Println(pointer2) // 輸出指標的位址
fmt.Println(*pointer2) // 輸出指標所指向的值,此時為10
}
<值> = *<指標變數>
我們可以把指標想像成是一個儲存資料地址的儲物櫃。這個地址上保存了一個特定的值。當我們在程序中使用指標,我們其實是在說:"去看看這個地址,你會找到我想要的資料。"
解引用操作就像是打開儲物櫃,查看裡面保存的內容。當我們在指標前放一個星號(*),我們其實是在說:"我想看看這個儲物櫃裡保存的東西。"
但是如果這個儲物櫃(指標)是空的(也就是說指標是 nil),那我們嘗試打開它查看裡面的東西時,程式會因為無法找到要查看的內容而"恐慌",也就是出現錯誤。這就是所謂的 "解引用一個 nil 指標會引發恐慌"。
以上為今天的內容
明天將會繼續講解stack、heap 及傳值
The Go Workshop 完全自學Go語言