如何解决接口和地址运算符
我很难理解为什么当返回类型是接口时可以使用地址运算符
func NewReader() IReader {
return &Reader{}
}
但是(当然)不是当返回类型是struct
时func NewReader() Reader {
return &Reader{} // cannot use &Reader literal (type *Reader) as type Reader in return argument
}
以后的功能签名是func MyFuncReader(r IReader)
,而reflect.TypeOf(r)
是*main.Reader
。
- 所以类型
IReader
隐藏了它是指针的事实吗? - 函数签名
func MyFuncReader(r IReader)
不能告诉我,是否已将指针或值传递给函数?
样品
- 带有接口https://play.golang.org/p/1Db1Jybp0rP的完整示例
- 没有接口https://play.golang.org/p/nPtu09yhe0C的完整示例
解决方法
如果函数的返回类型是接口类型,则可以返回实现该接口的所有值。 Spec: Return statements:
一个或多个返回值可以在“ return”语句中明确列出。每个表达式必须为单值,并且必须assignable为函数结果类型的相应元素。
在第一个示例中,Reader
具有使用指针接收器的方法,因此只有指向Reader
的指针(即*Reader
)才实现{{1} }界面。因此,您必须返回IReader
。
如果函数的返回类型为具体类型,则必须返回该具体类型的值,而不能返回该类型的指针的值。
,当返回类型为Reader
func NewReader() Reader { return &Reader{} // cannot use &Reader literal (type *Reader) as type Reader in return argument }
您不能使用指向Reader
类型的指针来代替Reader
类型。原因是它们不是同一类型。
当使用IReader
之类的接口作为返回类型时,如
func NewReader() IReader { return &Reader{} }
基本上,这意味着实现IReader
接口方法的 any 类型将被归类为实现该接口的类型,因此可以接受。由于在您的示例中,类型*Reader
实现了IReader
类型,因此此处是NewReader函数的可接受返回值。这意味着如果我引入一个新的type
来实现此接口,例如
type dummy int
func (d dummy) GetCount() int {
return d
}
func (d dummy) IncreaseCount() {
fmt.Println("Increased count: %d",d)
}
然后我可以做类似的事情
func NewReader() IReader {
var d dummy
d = 5
return d
}
,它将仍然有效。使用reflect
包进行检查时,此返回值的基础类型为dummy
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。