go语言 接口 小记
gandilong · · 3164 次点击 · · 开始浏览 接口理解:
type Operation interface{
Cut(a Integer)
Add(a Integer)
}
type Integer int
func (a Integer)Cut(b int) Integer{
return a-b
}
func (a Integer)Add(b int)Integer{
return a+b
}
var a Integer =0
var foo Operation = a
go语言会自动根据a类型所具有的方法,也就是Integer所具有的方法 自动生成
func (a *Integer)Cut(b int) Integer{
return a-b
}
func (a *Integer)Add(b int)Integer{
return a+b
}
所以说 接口中的方法是针对类型实例的,毕竟一个接口没实现 啥也做不了,只有引用一个类型实例对像才行。
所以在给接口付值 时 ,每个类型实例会根据自己的类型所具有的方法生成 对应的实例方法。
如:
func (a Integer)Add(b int)Integer{
return a+b
}
生成
func (a *Integer)Add(b int)Integer{
return a+b
}
注意:
为接口付值 有两种方式
1. var foo Operation = a 这种方式 a 只是代表一个Integer类型的值,go语言会根据a的类型,即Integer的方法生成相应的方法。
但是如果Integer方法中有这样的方法:
func (a *Integer)Add(b int)Integer{
return a+b
}
go语言是无法生成的。
所以需要第二种付值方式。
这种方式调用接口和调用类型方法一样,不会改变实例的实。
2.var foo Operation = &a
在这两种方式中 其实foo就是一个指针,如果Integer没有实例方法,全都是类型方法,第一种方法 go可以自动生成实例方法 这种方法实用性不大,因为改变不了实例本身的值 。
正宗的应该是第二种。
所以正宗的写法应该是
type Operation interface{
Cut(a Integer)
Add(a Integer)
}
type Integer int
func (a Integer)Cut(b int) Integer{
return a-b
}
func (a Integer)Add(b int)Integer{
return a+b
}
var a Integer= 6
var foo Operation = &a
如果接口中有方法名是以大写字母开头的,即便写成小写 go也会按大写来。实现接口的类型也必须照要。你懂的。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
接口理解:
type Operation interface{
Cut(a Integer)
Add(a Integer)
}
type Integer int
func (a Integer)Cut(b int) Integer{
return a-b
}
func (a Integer)Add(b int)Integer{
return a+b
}
var a Integer =0
var foo Operation = a
go语言会自动根据a类型所具有的方法,也就是Integer所具有的方法 自动生成
func (a *Integer)Cut(b int) Integer{
return a-b
}
func (a *Integer)Add(b int)Integer{
return a+b
}
所以说 接口中的方法是针对类型实例的,毕竟一个接口没实现 啥也做不了,只有引用一个类型实例对像才行。
所以在给接口付值 时 ,每个类型实例会根据自己的类型所具有的方法生成 对应的实例方法。
如:
func (a Integer)Add(b int)Integer{
return a+b
}
生成
func (a *Integer)Add(b int)Integer{
return a+b
}
注意:
为接口付值 有两种方式
1. var foo Operation = a 这种方式 a 只是代表一个Integer类型的值,go语言会根据a的类型,即Integer的方法生成相应的方法。
但是如果Integer方法中有这样的方法:
func (a *Integer)Add(b int)Integer{
return a+b
}
go语言是无法生成的。
所以需要第二种付值方式。
这种方式调用接口和调用类型方法一样,不会改变实例的实。
2.var foo Operation = &a
在这两种方式中 其实foo就是一个指针,如果Integer没有实例方法,全都是类型方法,第一种方法 go可以自动生成实例方法 这种方法实用性不大,因为改变不了实例本身的值 。
正宗的应该是第二种。
所以正宗的写法应该是
type Operation interface{
Cut(a Integer)
Add(a Integer)
}
type Integer int
func (a Integer)Cut(b int) Integer{
return a-b
}
func (a Integer)Add(b int)Integer{
return a+b
}
var a Integer= 6
var foo Operation = &a
如果接口中有方法名是以大写字母开头的,即便写成小写 go也会按大写来。实现接口的类型也必须照要。你懂的。