1. 程式人生 > 其它 >Go語言從入門到精通——結構體(struct)——方法

Go語言從入門到精通——結構體(struct)——方法

方法

  Go 語言中的方法(Method)是一種作用於特定型別變數的函式。這種特定型別變數叫做接收器(Receiver)。

  如果將特定型別理解為結構體或者"類"時,接收器的概念就類似於其他語言中的 this 或 self。

  在 Go 語言中,接收器的型別可以是任何型別,不僅僅是結構體,任何型別都可以擁有方法。

提示:在面向物件的語言中,類擁有的方法一般被理解為類可以做的事情。在 Go 語言中 "方法" 的概念與其他語言一致,只是 Go 語言建立 "接收器" 強調方法的作用物件是接收器,也就是類的例項,而函式沒有作用物件。

一、為結構體新增方法

  本節中,將會使用揹包作為“物件”,將物品放入揹包的過程作為“方法”,通過面向過程的方式和 Go 語言中結構體的方式來理解 “方法” 的概念。

1、面向過程實現方法

  面向過程中沒有 "方法" 概念,只能通過結構體和函式,由使用者使用函式引數和呼叫關係來形成接近 “方法” 的概念,程式碼如下:

package main

type Bag struct {
	items []int
}

//將一個物品放入揹包的過程
func Insert(b *Bag, itemid int){
	b.items = append(b.items, itemid)
}

func main(){
	bag := new(Bag)
	Insert(bag, 1001)
}

2、Go語言的結構體方法

  將揹包及放入揹包的物品中使用 Go 語言的結構體和方法方式編寫: 為 *Bag 建立一個方法,程式碼如下:

package main

type Bag struct {
	items []int
}

func (b *Bag) Insert(itemid int) {
	b.items = append(b.items, itemid)
}

func main() {
	bag := new(Bag)
	bag.Insert(1001)
}

二、接收器——方法作用的目標

  接收器的格式如下:

func (接收器變數 接收器型別) 方法名(引數列表)(返回引數){
    函式體
}
  • 接收器變數:接收器中的引數變數名在命名時,官方建議使用接收器型別名的第一個小寫字母,而不是 self、this 之類的命名。
  • 接收器型別:接收器型別和引數類似,可以是指標型別和非指標型別。
  • 方法名、引數列表、返回引數:格式與函式定義一致。

  接收器根據接收器的型別可以分為指標接收器、非指標接收器。兩種接收器在使用時會產生不同的效果。根據效果的不同,兩種接收器會被用於不同效能和功能要求的程式碼中。

1、理解指標型別的接收器

  指標型別的接收器由一個結構體的指標組成,更接近於面向物件的 this 或者 self。

  由於指標的特性,呼叫方法時,修改接收器指標的任意成員變數,在方法結束後,修改都是有效的。

  在下面的例子,使用結構體定義一個屬性(Property),為屬性新增 SetValue() 方法以封裝設定屬性的過程,通過屬性的 Value() 方法可以重新獲得屬性的數值。使用屬性時,通過 SetValue() 方法的呼叫,可以達成修改屬性值的效果。