为什么结构函数和普通函数是同一类型

下面代码中: type of struct Struct.Testis void func(),函数可以获取 中的所有参数,为什么和 的Struct t类型相同Struct.func()func()


type Struct struct {

    Val string

}


func (t *Struct) Test() {

    println(t.Val)

}


func main() {

    t := Struct{

        Val: "Struct",

    }

    f := t.Test

    f()

    f = func() {

        println("Hello world!")

    }

    f()

}


白衣染霜花
浏览 124回答 1
1回答

狐的传说

t.Test是一个方法值:如果表达式x具有静态类型T并且M在类型的方法集中T,x.M则称为方法值。方法值x.M是一个函数值,可以使用与 的方法调用相同的参数进行调用x.M。表达式x在方法值的求值过程中被求值并保存;然后将保存的副本用作任何调用的接收者,这些调用可能会在以后执行。方法x.Test()没有参数,x.Test函数也没有参数。接收器x在内部保存并在您x.Test稍后调用函数值时使用。它的类型将是func(),因此类型f也是func(),您可以为其分配任何类型也为 的值func()。不要混淆方法值和方法表达式:如果M在 type 的方法集中T,T.M是一个可以作为常规函数调用的函数,其参数与附加参数前缀相同,M该附加参数是方法的接收者。方法表达式“应用于”类型,而方法值“应用于”值。方法表达式导致函数值包含接收者类型(作为第一个参数),方法值不包含(接收者在内部保存)。因此,在您的情况下,方法表达式将是(*Struct).Test(注意指针:Test()具有指针接收器),并且它是 type 的函数func(Struct)。它可以这样使用/调用:f2 := (*Struct).Test f2(&t)再次输出,在Go PlaygroundStruct上尝试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go