美文网首页
Go 中的方法集合指针接收者和值接收者

Go 中的方法集合指针接收者和值接收者

作者: 莫Y兮 | 来源:发表于2017-05-28 21:58 被阅读998次

在Go语言中,可以给用户定义的类型添加新的行为。方法其实也是函数,只是在声明时,在关键字func方法名之间增加了一个参数,可以先简单理解为类型也作为了参数传递入了函数中,如下代码所示:

type user struct {
    name string
    email string
}

// 值接收者
func (u user) notify() {
    log.Printf("sending User Email to %s<%s>\n", u.name, u.email)
}

// 引用接收者
func (u *user) notifyPointer() {
    log.Printf("sending User Email to %s<%s>\n", u.name, u.email)
}

与普通的函数相比,又有一些不同:值接收者声明的方法,调用时会使用这个值的一个副本去执行,而指针接收者在调用者会共享调用方法时接收者所指向的值,即可以修改指向的值。
在使用时,值类型的接收者也可以使用指针类型的调用,如下:

func (u user) notify() {
    log.Printf("sending User Email to %s<%s>\n", u.name, u.email)
}

func main() {
    tom := &user{"tom", "tom@email.com"}
    tom.notify()
}

其实在Go的代码背后,已经对改类型进行了转换

(*tom).notify()

所以有如下的对照关系

方法接收者 实际可用类型
(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()
}

执行结果

# 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)

相关文章

  • Go 函数值接收者和指针接收者

    值接收者和指针接收者 值接收者使用值接收者声明方法,调用者会用这个值的一个副本来执行 指针接收者使用指针接收者声明...

  • 6-数据类型内存结构-interface

    1. 值接收者和指针接收者 实现了接收者是值类型的方法, 自动生成 了接收者是指针类型的方法; 实现了接收者是指针...

  • 23 Golang中的接口(三)

    结构体值接收者和指针接收者实现接口的区别 值接收者如果结构体中的方法是值接收者,那么实例化后的结构体值类型和指针类...

  • Go 中的方法集合指针接收者和值接收者

    在Go语言中,可以给用户定义的类型添加新的行为。方法其实也是函数,只是在声明时,在关键字func和方法名之间增加了...

  • go 方法

    Go 既允许使用值,也允许使用指针来调用方法,不必严格符合接收者的类型。

  • golang函数接收器及安全问题 2022-10-20

    不管接收者类型是值类型还是指针类型,都可以通过值类型或指针类型调用 实际上,当类型和方法的接收者类型不同时,其实是...

  • 2018-01-10

    是使用值接收者还是指针接收者,不应该由该方法是否修改了接收到的值来决定。这个决策 应该基于该类型的本质

  • 关于指针接收者和值接收者

    方法 方法能给用户定义的类型添加新的行为。方法实际上也是函数,只是在声明时,在关键字func 和方法名之间增加了一...

  • Go中方法接收者是指针类型和值类型的根本区别, 看这一篇就足够了

    要理解使用指针接收者和使用值接收者的根本区别只需要明确一点就够了:它们的方法名是不一样的。 方法名 我们拿Man和...

  • Golang | 方法集的那些事

    类型的值也可以调用指针接收者的方法! 学习golang中关于方法部分知识的人一定了解过方法集(Method Set...

网友评论

      本文标题:Go 中的方法集合指针接收者和值接收者

      本文链接:https://www.haomeiwen.com/subject/manhfxtx.html