goang Receiver & interface
package main import (
"fmt"
) type Pointer struct {
x string
} func (this *Pointer) PrintX() {
fmt.Printf("X:%s\n", this.x)
} func (this *Pointer) SetX(str string) {
this.x = str
} type Value struct {
x string
} func (this Value) PrintX() {
fmt.Printf("X:%s\n", this.x)
} func (this Value) SetX(str string) {
this.x = str
} func main() {
p1 := Pointer{x: "Pointer"}
p1.PrintX()
p1.SetX("Pointer1")
p1.PrintX() p2 := &Pointer{}
p2.PrintX()
p2.SetX("Pointer2")
p2.PrintX() p3 := Value{x: "Value"}
p3.PrintX()
p3.SetX("Value1")
p3.PrintX() p4 := &Value{x: "value"}
p4.PrintX()
p4.SetX("Value2")
p4.PrintX()
}
运行结果:
X:Pointer
X:Pointer1
X:
X:Pointer2
X:Value
X:Value
X:value
X:value
说明:1 无论是T*作为receiver还是T类型作为接受者,都可以用实例、或者实例的指针调用函数,但是T*作为接受者将改变receiver的内容,而T类型改变的是副本,原始对象不会改变。
type Type struct {
}
type PType struct {
}
type Inter interface {
post()
}
// 接收者非指针
func (t Type) post() {
}
// 接收者是指针
func (t *PType) post() {
}
func test() {
var it Inter
//var it *Inter //接口不能定义为指针
pty := &Type{}
it = ty // 将变量赋值给接口,OK
it.post() // 接口调用方法,OK, receiver 是T
ty := Type{}
it = pty // 把指针变量赋值给接口,OK
it.post() // 接口调用方法,OK, receiver 是T
pty2 := &PType{}
it = pty2 // 把指针变量赋值给接口,OK
it.post() // 接口调用方法,OK, receiver 是*T
//ty2 := PType{}
//it = ty2 // 将变量赋值给接口,error
//it.post() // 接口调用方法,error, receiver 必须是T,而不能是T
}
详细代码:http://play.golang.org/p/KG8-Qb7gqM
为什么编译器不考虑我们的值是实现该接口的类型?接口的调用规则是建立在这些方法的接受者和接口如何被调用的基础上。下面的是语言规范里定义的规则,这些规则用来说明是否我们一个类型的值或者指针实现了该接口:
- 类型
*T的可调用方法集包含接受者为*T或T的所有方法集
这条规则说的是如果我们用来调用特定接口方法的接口变量是一个指针类型,那么方法的接受者可以是值类型也可以是指针类型。显然我们的例子不符合该规则,因为我们传入 SendNotification 函数的接口变量是一个值类型。
- 类型
T的可调用方法集包含接受者为T的所有方法
这条规则说的是如果我们用来调用特定接口方法的接口变量是一个值类型,那么方法的接受者必须也是值类型该方法才可以被调用。显然我们的例子也不符合这条规则,因为我们 Notify 方法的接受者是一个指针类型。
语言规范里只有这两条规则,我通过这两条规则得出了符合我们例子的规则:
- 类型
T的可调用方法集不包含接受者为*T的方法


Interface也是引用类型。




goang Receiver & interface的更多相关文章
- QUICK START GUIDE
QUICK START GUIDE This page is a guide aimed at helping anyone set up a cheap radio scanner based on ...
- golang实现rabbitmq消息队列失败尝试
在工作中发现,有些时候消息因为某些原因在消费一次后,如果消息失败,这时候不ack,消息就回一直重回队列首部,造成消息拥堵. 如是有了如下思路: 消息进入队列前,header默认有参数 retry_nu ...
- go test 测试用例那些事(二) mock
关于go的单元测试,之前有写过一篇帖子go test测试用例那些事,但是没有说go官方的库mock,很有必要单独说一下这个库,和他的实现原理. mock主要的功能是对接口的模拟,需要在写代码的时候定义 ...
- GoLang设计模式08 - 命令模式
命令模式是一种行为型模式.它建议将请求封装为一个独立的对象.在这个对象里包含请求相关的全部信息,因此可以将其独立执行. 在命令模式中有如下基础组件: Receiver:唯一包含业务逻辑的类,命令对象会 ...
- golang监听rabbitmq消息队列任务断线自动重连接
需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...
- Receiver class com.mchange.v2.c3p0.impl.NewProxyResultSet does not define or inherit an implementation of the resolved method 'abstract boolean isClosed()' of interface java.sql.ResultSet.
背景: Mayabtis+springboot项目,连接数据库发生异常 报错内容: java.lang.AbstractMethodError: Receiver class com.mchange. ...
- Tun/Tap interface tutorial
Foreword: please note that the code available here is only for demonstration purposes. If you want t ...
- Interface Serializable
public interface Serializable Serializability of a class is enabled by the class implementing the ja ...
- 关于Go 的 Interface
最近在用Go语言写程序, 其中遇到一个场景:写了一个接口,3个实现接口的struct. 另外一个struct包含此接口,根据构造函数赋予不同的结构实现. 一开始struct里写的是接口的地址,但是在创 ...
随机推荐
- php expat+DOM+SimpleXML XML读取
XML 文件 将在我们的例子中使用下面的 XML 文件: <?xml version="1.0" encoding="ISO-8859-1"?> & ...
- excel设置单元格为文本
可以使用分裂功能,解决单元格无法设置成文本的问题.
- 用ajax异步请求一个块
使用用户控件,作为一个块,生成一段独立的html. 请求一个一般应用程序,在一般应用程序中加载读取用户控件,并给用户控件传值. Page page = new Page(); ...
- 九度oj 题目1026:又一版 A+B
题目描述: 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数. 输入: 输入格式:测试输入包含若干测试用例.每个测试用例 ...
- 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
我们枚举第一个经过的坏点,然后DP即可. 状态转移方程不是难点,难点在于组合数的处理. 将狼踩尽的博客中有很详细的证明过程,但是我只记住了结论 $n=a_1 * p^k+a_2*p^k-1...$ $ ...
- 雅礼培训 Problem A 【线段树】
题意 维护一段区间,支持求区间最大值,区间且,区间或 \(n,q<=2*10^5\) 题解 我们用线段树维护区间最大值 对于and和or运算, and实质就是强行把一些位改为0 or实质就是强行 ...
- 算法复习——欧拉函数(poj3090)
题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or e ...
- leetcode 349 map
只需要用map来标记1,今儿通过map的值来得到重叠的部分 class Solution { public: vector<int> intersection(vector<int& ...
- Bayan 2015 Contest Warm Up D. CGCDSSQ (math,pair,map,暴力)
哎,只能转题解了,,, 8165031 2014-10-10 15:53:42 njczy2010 D - CGCDSSQ GN ...