Go struct method 两种调用
在 Go 语言中,方法表达式是一种特殊的语法形式,它允许你直接引用某个类型的方法,而不是通过实例调用它。方法表达式可以用于将方法作为函数值传递或存储。通过这种方式,你可以在不立即调用方法的情况下,灵活地操作和使用方法。
方法表达式的语法
方法表达式的基本语法如下:
Type.Method
其中 Type 是类型名,Method 是方法名。方法表达式的结果是一个函数,该函数的第一个参数是接收 者(receiver)。
示例
以下是一些示例,展示了如何使用方法表达式:
值类型方法表达式 ⚡️
package main
import "fmt"
type MyType struct{}
func (m MyType) ValueMethod(msg string) {
fmt.Println("Value method called with:", msg)
}
func main() {
var v MyType
// 方法表达式
valueMethod := MyType.ValueMethod
// 调用方法表达式
valueMethod(v, "Hello, World!")
}
在这个示例中,MyType.ValueMethod 是一个方法表达式。它返回一个函数,该函数的第一个参数是 MyType 类型的接收者。
指针类型方法表达式 ⚡️
package main
import "fmt"
type MyType struct{}
func (m *MyType) PointerMethod(msg string) {
fmt.Println("Pointer method called with:", msg)
}
func main() {
var p MyType
// 方法表达式
pointerMethod := (*MyType).PointerMethod
// 调用方法表达式
pointerMethod(&p, "Hello, World!")
}
在这个示例中,(*MyType).PointerMethod 是一个方法表达式。它返回一个函数,该函数的第一个参数是 *MyType 类型的接收者。
方法表达式与方法值的区别
方法表达式与方法值(method value)不同。方法值是通过实例直接引用的方法,它隐含地绑定了接收者。
方法值示例 ⚡️
package main
import "fmt"
type MyType struct{}
func (m MyType) ValueMethod(msg string) {
fmt.Println("Value method called with:", msg)
}
func main() {
var v MyType
// 方法值
valueMethod := v.ValueMethod
// 调用方法值
valueMethod("Hello, World!")
}
在这个示例中,v.ValueMethod 是一个方法值。它返回一个函数,该函数不需要显式传递接收者,因为接收者已经隐含地绑定到 v。
总结
- 方法表达式:
Type.Method或(*Type).Method返回一个函数,该函数的第一个参数是接收者。 - 方法值:
instance.Method返回一个函数,该函数隐含地绑定了接收者。
方法表达式和方法值提供了灵活的方式来引用和传递方法,使得 Go 语言在函数式编程方面具有更大的灵活性。