Go語言入門8-方法method

方法就是一類帶特殊的 接收者 參數的函數。

方法接收者在它自己的參數列表內,位於func 關鍵字和方法名之間
  1. 通過顯示說明receiver(接收者)來實現與某個類型的組合,receiver是方法的強制性的第一個參數

在此例中,Abs 方法擁有一個名爲 v,類型爲 Vertex 的接收者。

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())	//5
}
  1. Receiver 可以是類型的值或者指針
type A struct {
	Name string
}

type B struct {
	Name string
}

func main() {
	a := A{}
	a.Print()
	fmt.Println(a.Name) //AAA
	b := B{}
	b.Print()
	fmt.Println(b.Name) //空的
}

func (a *A) Print() {
	a.Name = "AAA"
	fmt.Println("A") //A
}
func (b B) Print() {	//不通過指針的話只是一個值拷貝,不會影響本來的值
	b.Name = "BBB"
	fmt.Println("B")	//B
}

指針接收者的方法可以修改接收者指向的值(就像 Scale 在這做的)。由於方法經常需要修改它的接收者,指針接收者比值接收者更常用。

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)
}
//若使用值接收者,那麼 Scale 方法會對原始 Vertex 值的副本進行操作。(對於函數的其它參數也是如此。)Scale 方法必須用指針接受者來更改 main 函數中聲明的 Vertex 的值。
//試着移除Scale 函數聲明中的 *,觀察此程序的行爲如何變化。
func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs())
}
  1. 方法可以調用結構中的非公開字段
type A struct {
	name string
}

func main() {
	a := A{}
	a.Print()
	fmt.Println(a.name)	//123
}

func (a *A) Print() {
	a.name = "123"
}
  1. 不存在方法重載,接收者類型不同的話是可以有同名方法的,互不干擾
type A struct {
	Name string
}

type B struct {
	Name string
}

func main() {
	a := A{}
	a.Print()
	b := B{}
	b.Print()
}
//接收者類型不同的話是可以有同名方法的,互不干擾
func (a A) Print() {
	fmt.Println("AAA")	//AAA
}
func (b B) Print() {
	fmt.Println("BBB")	//BBB
}
  1. 只能爲同一個包中的類型定義方法
  2. 可以使用值或指針來調用方法,編譯器會自動完成轉換
  3. 如果外部結構和嵌入結構存在同名方法,則優先調用外部結構的方法
  4. 類型別名不會擁有底層類型所附帶的方法
type XY int

func (xy *XY) add(num int) {
	*xy += XY(num)
}

func main() {
	var a XY
	a.add(100)
	fmt.Println(a)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章