我可以键入断言一片接口值吗?

时间:2012-05-07 08:00:53

标签: interface type-conversion go type-assertion

我正在尝试从[]Node[]Symbol输入断言。在我的代码中,Symbol实现了Node接口。

以下是一些周围的代码:

 43 func applyLambda(args []Node, env Env) Node {
 44     if len(args) > 2 {
 45         panic("invalid argument count")
 46     }
 47     fixed, rest := parseFormals(args.([]Symbol))
 48     return Func{
 49         Body: args[1],
 50         FixedVarNames: fixed,
 51         RestVarName: rest,
 52     }
 53 }

这是我得到的错误:

./builtins.go:47: invalid type assertion: args.([]Symbol) (non-interface type []Node on left)

我确信这是有充分理由的。什么是最好的方法?

2 个答案:

答案 0 :(得分:16)

在说x.(T)变量x应该是接口类型,因为只有类型接口的变量动态类型不固定。虽然Node是一个界面,但[]Node却不是。切片是一种独特的非接口类型。因此,假设一片接口值也是一个接口也没有意义。

类型Node在您的代码中有一个明确的定义,因此是一个接口。您已为其指定了方法列表。类型[]Node不是那样的。它定义了哪些方法?

我明白你的来源。它可能是一个有用的捷径,但是没有意义。当syms.Method()的类型为syms[]SymbolMethod时,有点像期待Symbol工作。

使用此代码替换第47行可以达到您想要的效果:

symbols := make([]Symbol, len(args))
for i, arg := range args { symbols[i] = arg.(Symbol) }
fixed, rest := parseFormals(symbols)

答案 1 :(得分:5)

Go不允许这样做。您需要单独将Node转换为Symbol

不允许这样做的原因是[]Node[]Symbol具有不同的表示形式,因此转换需要为[]Symbol分配内存。