登录
首页 >  Golang >  Go问答

结构函数和普通函数为何属于同一类型

来源:stackoverflow

时间:2024-02-08 21:12:26 492浏览 收藏

哈喽!今天心血来潮给大家带来了《结构函数和普通函数为何属于同一类型》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

在以下代码中: struct struct.test的类型为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()
}

正确答案


t.testmethod value

如果表达式 x 具有静态类型 t 并且 m 位于 t 类型的方法集中,则 x.m 称为方法值方法值 x.m 是一个函数值,可以使用与 x.m 的方法调用相同的参数进行调用。 表达式 x 在方法值求值期间求值并保存;然后,保存的副本将用作任何调用中的接收者,该调用可能稍后执行。

x.test() 方法没有参数,因此 x.test 是一个没有参数的函数。接收方 x 会在内部保存,并在稍后调用 x.test 函数值时使用。它的类型将为 func(),因此 f 的类型也是 func(),您可以为其分配同样具有 func() 类型的任何值。

不要将方法值与 method expressions 混淆:

如果 m 位于 t 类型的方法集中,则 t.m 是一个可作为常规函数调用的函数,其参数与 m 相同,并以作为方法接收者的附加参数为前缀。

方法表达式“应用”在类型上,而方法值“应用”在上。方法表达式产生一个包含接收者类型(作为第一个参数)的函数值,而方法值则不包含(接收者在内部保存)。

因此,在您的情况下,方法表达式将是 (*struct).test (注意指针:test() 有指针接收器),它是一个类型为 func(struct) 的函数。它可以像这样使用/调用:

f2 := (*Struct).Test
f2(&t)

再次输出 struct,在 Go Playground 上尝试一下。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>