網頁

2021/6/26

Golang 什麼是Receiver

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差別」。


沒有留言:

張貼留言