iT邦幫忙

2023 iThome 鐵人賽

DAY 2
2
Modern Web

就是個Go,我也可以啦!GOGO系列 第 2

2023鐵人賽Day 2 Go怎麼傳值,先讀懂指標-1

  • 分享至 

  • xImage
  •  

我們先來說結論

  1. Pass by Value 在 Go 語言中的應用: Go語言在傳遞資料時基本上遵循"傳值調用"(Pass by Value)的規則。這意味著在函數調用過程中,傳遞的都是變數的副本,而不是變數本身。
  2. 垃圾回收與指標: Go語言具有垃圾回收機制,該機制對於管理在堆上動態分配的記憶體(通常通過指標來訪問)特別有用。然而,這並不意味著垃圾回收只適用於指標。實際上,任何不再使用且無法再被訪問的記憶體都會被視為垃圾,並被回收。
  3. 指標的使用與垃圾回收機制的負擔: 雖然使用指標可以減少記憶體使用量,但過度依賴指標可能會導致垃圾回收機制的負擔加重。這是因為在Go語言中,使用指標創建的動態記憶體需要由垃圾回收器來管理和清理,如果這種記憶體的使用過多,則可能會影響垃圾回收器的效能,進而影響整個程式的執行效能。

Go指標的基礎

什麼是指標

指標是一種類型的分類(同string , int...),一個指標可以儲存一個記憶體位址,在每次建立指標時,他都會有一個對應的類型,像是*int可以解讀為,一個指標指向int的指標類型

var <變數> *T

T為任意型別,類別T被稱為指標類型的base type

type Point *int // point為一個指標類型,並且base type為int
type PT *Point // PT為一個指標類型,並且base type 為Point

取得指標

  1. 使用內建函數new(): 我們可以用內建函數new來為任何類型的值開闢一塊內存並將此內存區塊的起始地址做為此值的位址回傳。
    • somevar := new(<型別>)
    • 此外他還會填入零值
      • "零值"是指變量在宣告但還未明確賦值時的默認值。

      • 以下是 Go 語言中不同類型變量的零值表格:

        變量類型 零值

        數值類型(如 int, float 等) | 0 |
        字符串類型(string) | "" (空字符串) |
        布林類型(bool) | false |
        指針或參考類型(如 *int, *string 等) | nil |
        結構類型(struct) | 每個成員的零值 |
        陣列類型(如 [...]Type 等) | 每個元素的零值 |
        切片(slice) | nil |
        映射(map) | nil |
        通道(chan) | nil |

      • 注意:對於指針或參考類型,nil 意味著該指針未指向任何值。對於切片、映射和通道類型,nil 則表示該類型的變量未被初始化。

  2. 我們可以使用 "&" 符號來獲取一個變數的記憶體地址。換句話說,假設你有一個變量 t,且其類型為 T(T 可以是任何類型,如 int、string 等),你可以使用 &t 來獲取這個變數的記憶體地址。然後 &t 這個表達式的類型就變成了 *T,也就是一個指向 T 類型變量的指標。所以,"&" 符號是一種方法,可以讓我們獲取變量在記憶體中的地址,並用這個地址來創建一個新的指標變量。
  • <變數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語言


上一篇
2023鐵人賽 Day 1 先搞清楚簡化到極致的變數宣告
下一篇
2023鐵人賽Day 3 Go怎麼傳值,先讀懂指標-2
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言