Skip to main content

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 语言在函数式编程方面具有更大的灵活性。