Go的方法集
方法集定义了接口的接受规则。
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类型的指针的方法集既包含值接收者声明的方法,也包含指针接收者声明的方法。
从接收者的角度来看规则
| Methods Receivers | Values |
|---|---|
| (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)
作者:不会写代码的程序猿
链接:https://www.jianshu.com/p/1a5c68fa4009
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Go的方法集的更多相关文章
- JS方法集
数组方法集 Angela.array = { //# 数组方法 // index, 返回位置! 不存在则返回 -1: index: function (t, arr) { //# 返回当前值所在数组的 ...
- 【终结版】C#常用函数和方法集汇总
C#里面的常用的函数和方法非常重要,然而做题的时候会经常忘记这些封装好的方法,所以我总结一下 C#常用函数和方法集. [1]C#操作字符串的常用使用方法 在 C# 中,您可以使用字符数组来表示字符串, ...
- go语言之进阶篇普通变量的方法集
1.普通变量的方法集 示例: package main import "fmt" type Person struct { name string //名字 sex byte // ...
- go语言之进阶篇指针类型和普通类型的方法集
方法集 类型的方法集是指可以被该类型的值调用的所有方法的集合. 用实例实例 value 和 pointer 调用方法(含匿名字段)不受方法集约束,编译器编总是查找全部方法,并自动转换 receiver ...
- c#.net常用函数和方法集
1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.D ...
- [GO]方法集
指针变量的方法集 package main import "fmt" type Person struct { name string sex byte age int } fun ...
- legend---三、方法集思路
legend---三.方法集思路 一.总结 一句话总结:其实也就是工具包思路,会极大的简化编程,清晰逻辑 1.多if转换成简洁单if怎么实现? 下面这段代码是错的,if的这种写法只适合直接return ...
- go语言规范之方法集
Go语言规范里定义的方法集的规则 Values Methods Receivers ----------------------------------------------- T (t T) *T ...
- Go语言接口内部布局和方法集详解
1. 接口值内部布局 如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋给这个接口类型的值.这个赋值会把用户定义的类型的值存入接口类型的值.赋值完成后得到的值称 ...
随机推荐
- MIT Molecular Biology 笔记6 转录的调控
视频 https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...
- (转)EntityFramework.Extensions
转自:http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Relea ...
- bzoj2388(分块 凸包)
好像没有什么高级数据结构能够很高效地实现这个东西: 那就上万能的分块,我们用一些数形结合的思想,把下标看成横坐标,前缀和的值看成纵坐标: 给区间内每个数都加k相当于相邻两点的斜率都加上k: 这种东西我 ...
- web-day2
第2章WEB02-CSS&JS篇 今日任务 使用CSS完成网站首页的美化 使用CSS完成网站注册页面的美化 使用JS完成简单的数据校验 使用JS完成图片轮播效果 教学导航 教学目标 了解CSS ...
- Foundation-NSRunLoop
Objective-C之run loop详解 Objective-C之run loop详解 RunLoop 详解
- MapReduce编程之wordcount
实践 MapReduce编程之wordcount import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Fi ...
- [ 9.13 ]CF每日一题系列—— 340A GCD & LCM
Description: [ 着实比较羞愧,都想着去暴力,把算法(方法)也忘了] A只涂x,2x,3x……,B只涂y,2y,3y……问你A和B共同涂的墙的个数 Solution: 就是求x和y的lcm ...
- day06_雷神_面向对象初识
day_06 递归函数 自己用自己.一般递归100多次,都没有解决的问题,放弃递归. count = 0 def func1(): global count count += 1 print(coun ...
- [LISP] LISP Collections
lispbox: https://common-lisp.net/project/lispbox/ SBCL: http://sbcl.org/ <Common Lisp in practica ...
- Nginx 实现端口转发
https://www.cnblogs.com/zhaoyingjie/p/7248678.html Nginx 实现端口转发 什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书 ...