函数

方法、函数。

如果我们定义一个类型A, 并给它关联一个方法,然后就可以通过这个类型A的变量来调用这个方法了。

a := A{name: "go"}
a.Name()

这种调用方式其实是语法糖,实际上和调用 A.Name(a) 这个函数是一样的。 a.Name() 这里的变量a就是方法接受者,它会作为方法Name的第一个参数传入。

package main

import (
    "fmt"
    "reflect"
)

type A struct {
    name string
}

func (a A) Name() string {
    return a.name
}

func NameOfA(a A) string {
    return a.name
}

func main() {
    a := A{name: "go"}
    fmt.Println(a.Name())
    fmt.Println(A.Name(a))
    
    t1 := reflect.TypeOf(A.Name)
    t2 := reflect.TypeOf(NameOfA)
    fmt.Println(t1 == t2) //true
}

Go语言中函数类型只和参数与返回值相关,上面代码 t1 与 t2 两个类型值相等就能构证明方法本质上就是普通的函数,而接受者就是隐含的第一个参数。