我可以输入断言接口值分得一杯羹?(Can I type assert a slice of inte

2019-06-24 05:11发布

我想键入从断言[]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)

我敢肯定有一个很好的理由。 什么是前进的最好方式?

Answer 1:

在说x.(T)变量x应接口类型的,因为只有对类型的接口动态类型的变量是不固定的。 虽然Node是一个接口, []Node是没有的。 切片是一个不同的,非接口类型。 所以它只是没有意义的假设接口值的片为一个接口了。

类型Node在你的代码一个明确的定义,因此是一个接口。 您已指定为它的方法列表。 键入[]Node并非如此。 它定义了什么样的方法?

我了解您从这个即将到来。 这可能是有用的快捷方式,但只是没有任何意义。 这有点像预期syms.Method()时,工作syms的类型是[]SymbolMethodSymbol

更换线47与此代码,你想要做什么:

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


Answer 2:

围棋不允许这样。 你需要转换Node ,以Symbol分别。

为什么这是不允许的原因是[]Node[]Symbol有不同的表示,这样的转换需要分配内存[]Symbol



文章来源: Can I type assert a slice of interface values?