Go 方法指针接收者和值接收者

转载:原文地址.
go语言的函数和方法
Go 语言可以给自定义的类型添加一个方法。这里的方法其实也是函数,跟函数的区别在于在 func 关键字和函数名中间增加了一个参数,可以认为该类型也作为了参数传递入了函数中
方法指针接收者和值接收者

package main

import "fmt"

type Person struct {
name string
age int
}

//值接收者
func (p Person) sayHello() {
fmt.Println(p.name)
}

//引用接收者
func (p *Person) setName(name string) {
p.name = name
}

func main() {
p := Person{name: "mervyn"}
p.sayHello()
p.setName("tz")
p.sayHello()
}
  • 值接收者声明的方法,调用时传递的是这个值的一个副本。
  • 引用接收者声明的方法,在调用者会共享调用方法时接收者所指向的值。
    注意:值类型的接收者也可以使用指针类型的调用。例:
p := &Person{name: "mervyn"}
(*p).sayHello()

所以有如下的对照关系:

方法接收者实际可用类型
(t T)T and *T
(t *T)*T

因此在如下的代码执行时,会报错,因为interface声明了notify方法,而方法接收者使用的是指针类型,因而只有*user实现了notify方法,user并没有实现,所以sendNotification的参数应该是&u,而不是u。

package main

import (
    "log"
)

type notifier interface {
    notify()
}

type user struct {
    name  string
    email string
}

func (u *user) notify() {
    log.Printf("Sending user email to %s", u.name)
}

func main() {
    u := user{"Bill", "bill@email.com"}

    sendNotification(u)
}
func sendNotification(n notifier) { //注意此处传递的参数类型
    n.notify()
}

执行结果

p := &Person{name: "mervyn"}
(*p).sayHello()
#command-line-arguments
./main.go:23: cannot use u (type user) as type notifier in argument to sendNotification:
        user does not implement notifier (notify method has pointer receiver)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值