在 Go 语言中,你可以为任何类型定义方法。一个方法就是一个特殊类型的函数,它被关联到一个特定的类型,这个类型被称为该方法的接收者。
方法的定义
在 Go 中,你可以为任何类型(除了指针和接口)定义方法。一个方法定义看起来像这样:
// 这是一个类型
type MyType int
// 这是一个方法,它的接收者是 MyType
func (m MyType) MyMethod() {
// 方法体
}
在这个例子中,MyMethod 是一个方法,它的接收者是 MyType。你可以像调用函数一样调用这个方法。
方法的调用
你可以像这样调用方法:
var m MyType
m.MyMethod()
在这个例子中,我们首先声明了一个 MyType 类型的变量 m,然后调用了它的 MyMethod 方法。
方法和接收者
在方法的声明中,接收者被放在了函数名之前。这个接收者可以是任何类型的一个值或者是一个指针。如果它是一个值,那么在方法内部对其的修改不会影响到原始的值。
让我们看一个例子:
type MyType int
func (m MyType) SetValue(newValue MyType) {
m = newValue
}
func main() {
var x MyType = 5
x.SetValue(10)
fmt.Println(x) // 输出:5
}
在这个例子中,SetValue 方法试图修改它的接收者 m 的值。但是因为 m 是一个值,而不是一个指针,所以这个修改在方法外部是不可见的。所以,尽管我们尝试将 x 的值设为 10,但 x 的值仍然是 5。
如果我们想让方法能够修改它的接收者的值,我们需要使用一个指针作为接收者:
type MyType int
func (m *MyType) SetValue(newValue MyType) {
*m = newValue
}
func main() {
var x MyType = 5
(&x).SetValue(10)
fmt.Println(x) // 输出:10
}
在这个例子中,SetValue 方法的接收者是 *MyType(MyType 的一个指针)。这意味着 m 是一个指向 MyType 类型值的指针,我们可以通过这个指针来修改这个值。因此,这个程序将 x 的值设为了 10。
总的来说,方法是关联到特定类型的函数。你可以为任何类型定义方法,只要这个类型不是一个指针或者一个接口。你可以使用值或者指针作为方法的接收者,但只有使用指针作为接收者的方法才能修改它的接收者的值。 推荐阅读: