package main
import "fmt"
type Mutatable struct {
a int
b int
}
func (m Mutatable) StayTheSame() {
m.a = 5
m.b = 7
}
func (m *Mutatable) Mutate() {
m.a = 5
m.b = 7
}
func main() {
m := &Mutatable{0, 0}
fmt.Println(m)
m.StayTheSame()
fmt.Println(m)
m.Mutate()
fmt.Println(m)
上述程序的输出是:
&{0 0}
&{0 0}
&{5 7}
这被称为“接收器”。在第一种情况下 (m Mutatable) 它是一个值类型,在第二种情况下 (m *Mutatable) 它是一个指针。这在 Go 中的工作方式可能与其他一些语言略有不同。然而,接收类型的工作方式或多或少类似于大多数面向对象编程中的类。这是你调用方法的东西,很像如果我把一些方法 A 放在一些类 Person 那么我需要一个类型的实例 Person 为了调用 A (假设它是一个实例方法而不是静态的!)。
这里的一个陷阱是接收者像其他参数一样被推入调用堆栈,所以如果接收者是一个值类型,就像 Mutatable的情况一样,那么你将处理你调用的东西的副本返回调用范围后,方法的含义类似于 h.Name = "Evan" 将不会持续存在。出于这个原因,任何希望改变接收者状态的东西都需要使用指针或返回修改后的值(如果你正在寻找的话,会提供更多的不可变类型范例)。
转载https://segmentfault.com/q/1010000042863782
Comments | NOTHING