函数声明语法:函数名前括号内的东西


 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

声明:小小博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 函数声明语法:函数名前括号内的东西


Carpe Diem and Do what I like