iT邦幫忙

2021 iThome 鐵人賽

DAY 8
1
Modern Web

還喝不 go系列 第 8

[13th][Day8] Pointer

Pointer 到底是個什麼東東呢?指標?指引?位址?指針?
目前為止提到的變數都很單純 int float string bool ... 等等
那麼 ... Pointer 又是如何呢?來看看 wiki 的解說:

計算機概論告訴我們,指標(Pointer)是程式語言中的一類資料類型及其物件或變數,用來表示或儲存一個記憶體位址,這個位址的值直接指向(points to)存在「該位址的物件」的值。

就像我知道霍格華茲的地址是 蘇格蘭OOOO路OO號
但我並「不知道」它確切位置到底在哪

Go 支援指標 (pointer),在學習 coding 的過程中,指標是必經的門檻、無可避免的
but ... 對沒接觸過的人來說,指標不是那麼的容易理解,常因誤用指標而造成 segment fault(記憶體區段錯誤) … 等錯誤。對 golang 來說就是不斷的 panic 然後又 panic 一直在 panic

golang 的指標(pointer)比較簡化,不僅沒有指標運算,也不需要手動控制記憶體釋放。

package main

import "fmt"

type House struct {
    Name  string
    Price int
}

func (c House) GetPrice() {
    fmt.Println(c.Price)
}

func main() {
    h := &House{"Dibao", 100000000}
    h.GetPrice()
}

宣告變數 h 為 一個 struct , type 為 House
h 裡的 name 為 Dibao
Price 為 100000000

上面是個單純的 Go struct 例子,只有單純的撈出 struct 中的某個值
使用到保留字 type struct
那 ... 如果我想要動態更新 Price 值,要怎麼做呢?

package main

import "fmt"

type House struct {
    Name  string
    Price int
}

func (c House) GetPrice() {
    fmt.Println("price:", c.Price)
}

func (c House) UpdatePrice(price int) {
    c.Price = price
}

func main() {
    h := &House{"Dibao", 100000000}
    h.GetPrice()
    h.UpdatePrice(10000)
    h.GetPrice()
}

上面可以看到輸出的結果仍然是 100000000,只用 value 傳值是無法改變 Struce 內成員的。我們可以用另外方式繞過。

經過 c.UpdatePrice(10000) 後

c.GetPrice()印出來的仍然是 100000000
(變成一萬我還不買爆)


上一篇
[13th][Day7] func -1
下一篇
[13th][Day9] Pointer-1
系列文
還喝不 go23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言