1. 程式人生 > 程式設計 >詳解golang中的method

詳解golang中的method

什麼是method(方法)?method是函式的另外一種形態,隸屬於某個型別的方法。

method的語法:

func (r Receiver) funcName (parameters) (result)

receiver可以看作是method的第一個引數,method並且支援繼承和重寫。

  • Go中雖沒有class,但依舊有method
  • 通過顯示說明receiver來實現與某個型別的結合
  • 只能為同一個包中的型別定義方法
  • receiver可以是型別的值或者指標
  • 不存在方法過載
  • 可以使用值或指標來呼叫方法,編譯器會自動完成轉換
  • 從某種意義上來說,方法是函式的語法糖,因為receiver其實就是方法所接收的第一個引數(Method Value vs. Method Expression)
  • 如果外部結構和嵌入結構存在同名方法,則優先呼叫外部結構的方法
  • 類型別名不會擁有底層型別所附帶的方法
  • 方法可以呼叫結構中的非公開欄位

go version go1.12

/**
 * 什麼是method(方法)?method是函式的另外一種形態,隸屬於某個型別的方法。
 * method的語法:func (r Receiver) funcName (parameters) (result)。
 * receiver可以看作是method的第一個引數,method並且支援繼承和重寫。
 */
package main

import (
  "fmt"
)

type Human struct {
  name string
  age int
}

// 欄位繼承
type Student struct {
  Human // 匿名欄位
  school string
}
type Employee struct {
  Human  // 匿名欄位
  company string
}

// 函式的另外一種形態:method,語法:func (r Receiver) funcName (parameters) (result)
// method當作struct的欄位使用
// receiver可以看作是method的第一個引數
// 指標作為receiver(接收者)和普通型別作為receiver(接收者)的區別是指標會對例項物件的內容發生操作,
// 普通型別只是對副本進行操作
// method也可以繼承,下面是一個匿名欄位實現的method,包含這個匿名欄位的struct也能呼叫這個method
func (h *Human) Info() {
  // method裡面可以訪問receiver(接收者)的欄位
  fmt.Printf("I am %s,%d years old\n",h.name,h.age)
}

// method重寫,重寫匿名欄位的method
// 雖然method的名字一樣,但是receiver(接收者)不一樣,那麼method就不一樣
func (s *Student) Info() {
  fmt.Printf("I am %s,%d years old,I am a student at %s\n",s.name,s.age,s.school)
}
func (e *Employee) Info() {
  fmt.Printf("I am %s,I am a employee at %s\n",e.name,e.age,e.company)
}
func main() {
  s1 := Student{Human{"Jack",20},"tsinghua"}
  e1 := Employee{Human{"Lucy",26},"Google"}
  // 呼叫method通過.訪問,就像struct訪問欄位一樣
  s1.Info()
  e1.Info()
}

以上就是詳解golang中的method的詳細內容,更多關於golang中的method的資料請關注我們其它相關文章!