詳解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, %d years old, 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的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Golang通脈方法詳情
- 詳解Golang語言中的interface
- Golang 使用Map實現去重與set的功能操作
- golang fmt格式“占位符”的實例用法詳解
- golang中json操作的完全指南