Go方法集-应该传值类型还是指针类型?

方法集定义了一组关联到指定类型的值或者指针的方法。

定义方法时使用的接收者类型决定了这个方法是关联到值还是关联到指针还是两者都关联

规范里描述的方法集

values(值)methods receivers(方法接收者类型)
T(t T)
*T(t T)和(*t T)
值的方法集只包含值接收者声明的方法。
指针的方法集包含值接收者声明的方法,和指针接收者声明的方法

从接收者类型的角度看方法集

methods receivers(方法接收者类型)values(参数值类型)
(t T)T 和 *T
(t *T)*T

代码示例

type notifier interface {
        notify()
}

type user struct {
        name string
        email string
}

func (u *user) notify()  {
        fmt.Printf("Sending user email to %s<%s>\n",
                u.name,
                u.email)
}
func main() {
        u:=user{"Bill","bill@gmail.com"}
        sendNotification(&u) //只能是指针类型
}
func sendNotification(n notifier){
        n.notify()
}

指针接收者类型的user实现了接口的方法,

根据上面第二个表格,可以推断方法的参数类型也只能是指针类型。

内容来自:Go in Action