去错误:"嵌入式类型不能是指向接口的指针"

时间:2016-11-09 08:47:24

标签: pointers go struct build interface

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

var appCache = window.applicationCache;

appCache.update(); // Attempt to update the user's cache.

...

if (appCache.status == window.applicationCache.UPDATEREADY) {
  appCache.swapCache();  // The fetch was successful, swap in the new cache.
}

错误:

  

./ test.go:18:嵌入式类型不能是指向接口的指针

为什么我不能嵌入type IFile interface { Read() (n int, err error) Write() (n int, err error) } type TestFile struct { *IFile }

1 个答案:

答案 0 :(得分:1)

语言规范不允许。规范中的相关部分:Struct types:

  

使用类型但没有显式字段名称声明的字段是匿名字段,也称为嵌入式字段或在结构中嵌入类型。必须将嵌入类型指定为类型名称T或指向非接口类型名称*T指针,并且T本身可能不是指针类型。非限定类型名称用作字段名称。

指向接口类型的指针很少有用,因为接口类型可能包含指针或非指针值。

话虽如此,如果实现IFile类型的具体类型是指针类型,那么指针值将包装在类型为IFile的接口值中,因此您仍需要嵌入IFile,只是实现IFile的值将是一个指针值,例如

// Let's say *FileImpl implements IFile:
f := TestFile{IFile: &FileImpl{}}

编辑:回答您的评论:

首先,这是Go,而不是C ++。在Go中,接口不是指针,但它们表示为一对(type;value),其中"值"可以是指针或非指针。有关此内容的更多信息,请参阅博文:The Laws of Reflection: The representation of an interface

其次,如果FileImpl是一种类型,f := TestFile{IFile : &FileIml}显然是编译时错误,那么您需要*FileImpl&FileImpl的值,而不是&FileImpl{} 。例如,您需要composite literal > library(rvest) > > html = read_html("http://www.finviz.com/quote.ashx?t=AA&ty=c&p=d&b=1") > > cast = html_nodes(html, ".table-dark-row:nth-child(2) .snapshot-td2:nth-child(2)") > cast {xml_nodeset (1)} [1] <td width="8%" class="snapshot-td2" align="left">\n <b>11.58B</b>\n</td> > 形式的library(rvest) html = read_html("http://www.finviz.com/quote.ashx?t=AA&ty=c&p=d&b=1") cast = html_nodes(html, ".table-dark-row:nth-child(2) .snapshot-td2:nth-child(2)") html_text(cast) %>% gsub(pattern = "B", replacement = "") %>% as.numeric() ,因此它应该像我在上面发布的那样。