gpt4 book ai didi

pointers - 转到错误 : "embedded type cannot be a pointer to interface"

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:33 26 4
gpt4 key购买 nike

以下代码给出了编译时错误:

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, and T 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com