- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
以下代码给出了编译时错误:
type IFile interface {
Read() (n int, err error)
Write() (n int, err error)
}
type TestFile struct {
*IFile
}
错误:
./test.go:18: embedded type cannot be a pointer to interface
为什么我不能嵌入*IFile
?
最佳答案
语言规范不允许。规范中的相关部分:Struct types:
A field declared with a type but no explicit field name is an anonymous field, also called an embedded field or an embedding of the type in the struct. An embedded type must be specified as a type name
T
or as a pointer to a non-interface type name*T
, andT
itself may not be a pointer type. The unqualified type name acts as the field name.
指向接口(interface)类型的指针很少有用,因为接口(interface)类型可能包含指针或非指针值。
话虽如此,如果实现您的IFile
类型的具体类型是指针类型,那么指针值将被包装在IFile
类型的接口(interface)值中,所以你仍然必须嵌入IFile
,只是实现IFile
的值将是一个指针值,例如
// Let's say *FileImpl implements IFile:
f := TestFile{IFile: &FileImpl{}}
编辑: 回复您的评论:
首先,这是 Go,不是 C++。在 Go 中,接口(interface)不是指针,而是表示为一对(type;value)
,其中“value”可以是指针也可以是非指针。博客文章中有更多相关信息:The Laws of Reflection: The representation of an interface .
其次,如果FileImpl
是类型,f := TestFile{IFile : &FileIml}
显然是编译时错误,需要的值*FileImpl
和 &FileImpl
显然不是。例如,您需要一个 composite literal这是 &FileImpl{}
的形式,所以它应该像我上面发布的那样。
关于pointers - 转到错误 : "embedded type cannot be a pointer to interface",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40502863/
我是一名优秀的程序员,十分优秀!