面试题答案
一键面试区别
- 方法值:
- 方法值是通过实例调用方法后得到的一个函数值,它绑定了实例的接收器。语法形式为
实例.方法
。调用该函数值时,不需要再显式传入接收器,因为已经在获取方法值时绑定好了。 - 例如:
- 方法值是通过实例调用方法后得到的一个函数值,它绑定了实例的接收器。语法形式为
package main
import "fmt"
type Person struct {
Name string
}
func (p Person) SayHello() {
fmt.Printf("Hello, I'm %s\n", p.Name)
}
func main() {
p := Person{Name: "John"}
sayHelloMethodValue := p.SayHello
sayHelloMethodValue() // 不需要再传入接收器p
}
- 方法表达式:
- 方法表达式是
类型.方法
的形式,它得到的是一个普通函数,调用时需要显式传入接收器。语法形式为类型.方法
。 - 例如:
- 方法表达式是
package main
import "fmt"
type Person struct {
Name string
}
func (p Person) SayHello() {
fmt.Printf("Hello, I'm %s\n", p.Name)
}
func main() {
p := Person{Name: "John"}
sayHelloMethodExpression := Person.SayHello
sayHelloMethodExpression(p) // 需要显式传入接收器p
}
方法值在实际场景中的应用
在需要将方法作为参数传递给其他函数时,方法值非常有用。比如在实现一个事件驱动的系统中,某个事件发生时需要执行特定实例的方法。
package main
import (
"fmt"
"time"
)
type Button struct {
Label string
}
func (b Button) Click() {
fmt.Printf("Button %s clicked!\n", b.Label)
}
func RegisterClickListener(button Button, clickFunc func()) {
// 模拟事件触发,这里用定时器触发
go func() {
time.Sleep(2 * time.Second)
clickFunc()
}()
}
func main() {
myButton := Button{Label: "Submit"}
clickMethodValue := myButton.Click
RegisterClickListener(myButton, clickMethodValue)
// 防止程序退出
select {}
}
在上述代码中,RegisterClickListener
函数接受一个Button
实例和一个无参数的函数clickFunc
,通过方法值myButton.Click
获取绑定实例的函数,并将其作为参数传递给RegisterClickListener
,实现了事件触发时执行特定实例的方法。