Go語言的Receiver是綁定function到特定type成為其method的一個參數。
光看上面的敘述的可能難以理解,請看以下面範例。
下面定義了一個struct Employee
。然後宣告一個function String()
並綁定為Employee
的method。而function名稱"String"前的參數(e Employee)
即為receiver。
package main
import (
"strconv"
"fmt"
)
// define struct 'Employee'
type Employee struct {
Id int
Name string
Age int
}
// declare method 'String()' bind to 'Employee' by receiver '(e Employee)'
func (e Employee) String() string {
return "Employee{" +
"Id=" + strconv.Itoa(e.Id) +
", Name=" + e.Name +
", Age=" + strconv.Itoa(e.Age) +
"}"
}
func main() {
employee := Employee{1, "John", 33}
fmt.Println(employee.String()) // Employee{Id=1, Name=John, Age=33}
}
換句話說,一個function加了receiver即成為一個type的method。
所以Go的function和method的差別在於是否有receiver。method有reciever,function沒有。
Receiver參數必須指定一個型態T
或指向該型態的指標(pointer) *T
。例如上面範例receiver參數的型態為Employee
。Receiver指定的T
稱為base type,不可以是interface或pointer,且必須定義在與method同個package中。一旦function定義了receiver成為base type的method後,只有該型態的變數可以.
來呼叫method,例如上面範例的employee.String()
。
Receiver又分為value reciever及pointer receiver,請參考「Golang value receiver與pointer receiver差別」。
沒有留言:
張貼留言