Golang 值类型结构体和指针类型的结构体实现接口的区别(方法集)

方法集

这里先说一下golang的方法集的概念,有助于下面代码的理解:
golang的方法集定义了一组关联到给定类型的值或者指针的方法。定义方法时使用的接收者的类型决定了这个方法是关联到值还是关联到指针,还是都关联。
翻译一下官方的定义就是如果接口接受的是一个指针接收者类型的值,那么可以使用值类型或者指针类型的接口实现,否则只能用值类型接收值实现。并且指针接收者类型实现后可以使用接口的所有的方法(包括使用值类型接受的方法),反之,如果是值类型接受实现,那么只能调用接口中其他的值类型的方法
代码:

package main

import "fmt"

type  notifier interface {
    notify()
}

type user struct {
    name string
    email string
}
//注意这里是指针类型接收者
func (u *user) notify()  {
    fmt.Printf("Send user email to %s,%s \n",u.name,u.email)
}
func main() {
    u:=user{
        name:  "汤姆",
        email: "qiong@email.com",
    }
    send(&u) //这里是指针类型的接收者 使用send(u)则会报错!

}

func send(n notifier)  {
    n.notify()
}
posted @ 2022-05-27 23:16  青柚  阅读(249)  评论(0编辑  收藏  举报