Golang語言中的method是什麼

frankphper發表於2019-04-29

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

/**
 * 什麼是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()
}

相關文章