iT邦幫忙

0

Golang 每日一小時(Day8)

go
  • 分享至 

  • xImage
  •  

今天開頭就又學了一種新的 function 寫法,該型別專屬的 method,有一點點 class method 的感覺,在 function name 前面指定 receiver (某個型別)。

package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
	v := Vertex{3, 4}
	fmt.Println(v.Abs())
}

receiver 不管是 value or pointer,實際使用時帶入另外一種也成立:

func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

v := Vertex{3, 4}
v.Scale(2)

p := &Vertex{4, 3}
p.Scale(3)

不過跟 GPT 討論的時候提到重點:

只有「addressable」的 value 才可以自動轉 pointer。

而 addressable 就是指可以用 "&" 取得位址的值,那什麼東西不能用 & 取址?

  1. literal (臨時值)
&Person{}
  1. function 回傳值
func getPerson() Person {
    return Person{}
}

&getPerson()
  1. map element
m := map[string]Person{}
&m["a"] 

官方也直接提出兩點為何要將 receiver 定成 pointer,第一點顯而易見就是可以更改型別變數的內容,但第二點就比較專業一點了,通常初學者不會想到這塊:

The second is to avoid copying the value on each method call. This can be more efficient if the receiver is a large struct

今天時間比較趕,就先學到這裡了~


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言