美文网首页Go
Go的方法集

Go的方法集

作者: 不会写代码的程序猿 | 来源:发表于2017-06-23 17:04 被阅读0次

方法集定义了接口的接受规则。

package main

import "fmt"

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@email.com"}
    sendNotificatioin(u)
}

func sendNotificatioin(n notifier) {
    n.notify()
}

这段代码看起来是没问题的,但是无法通过编译的。

./main.go:20: cannot use u (type user) as type notifier in argument to sendNotificatioin:
        user does not implement notifier (notify method has pointer receiver)

user类型的值没有实现notify接口。

Go语言里定义的方法集的规则是:
从值的角度来看规则

Values Methods Receivers
T (t T)
*T (t T) and (t *T)

T类型的值的方法集只包含值接收者声明的方法。而指向T类型的指针的方法集既包含值接收者声明的方法,也包含指针接收者声明的方法。

从接收者的角度来看规则

Values Methods Receivers
(t T) T and *T
(t *T) *T

使用指针接收者来实现一个接口,那么只有指向那个类型的指针才能够实现对应的接口。如果使用值接收者来实现一个接口,那么那个类型的值和指针都能够实现对应的接口。

例如:
①:func (u *user) notify() {
fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email)
}
sendNotificatioin(&u)

②:func (u user) notify() {
fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email)
}
sendNotificatioin(u)

③:func (u user) notify() {
fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email)
}
sendNotificatioin(&u)

相关文章

  • Go的方法集

    方法集定义了接口的接受规则。 这段代码看起来是没问题的,但是无法通过编译的。 user类型的值没有实现notify...

  • go 接口

    精髓 《go语言实战》5.4.3方法集。要理解方法集的含义!方法集与接口密切相关。 代码清单 5-42 展示了规范...

  • 第04天(面对对象编程)_03

    11_方法的继承.go 12_方法的重写.go 13_方法值.go 14_方法表达式.go 15_接口的定义和实现.go

  • go 语言接口

    Go 接口实现机制很简洁,只要目标类型方法集内包含接口声明的全部方法,就被视为实现了该接口,无须做显示声明,当然,...

  • Golang资料集Go最新资料汇总链接更改

    Go最新资料汇总链接 Golang资料集 《Platform-native GUI library for Go》...

  • golang系列教程

    Go包管理 Go开发工具 Go Doc 文档 Go 数组 Go 切片 Go Map Go 类型 Go 函数方法 G...

  • 第11章 1.接口定义

    1、初识接口 2、 直接定义接口实例 3、 判断类型,相当于typeof 4、方法集调用规则 Go 语言规范定义了...

  • go-micro 新版本工具集弃用了consul

    go-micro 新版本工具集弃用了consul 拥抱了etcd 所以如果要使用go-micro工具集 建议使用e...

  • go语言中的方法

    go支持OO语言的一些特性,方法就是其中之一。本文将介绍go语言中方法相关的概念。 方法声明 在go语言中,我们可...

  • 21. Go 协程

    21. Go 协程 Go 协程是什么? Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是...

网友评论

    本文标题:Go的方法集

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