23

我正在尝试从 a 键入 assert[]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)

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

4

2 回答 2

24

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

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

我明白你是从哪里来的。这可能是一个有用的捷径,但没有任何意义。这有点像期望syms.Method()syms' 类型为 '[]Symbol和'Method为' 时工作Symbol

用此代码替换第 47 行可以满足您的要求:

symbols := make([]Symbol, len(args))
for i, arg := range args { symbols[i] = arg.(Symbol) }
fixed, rest := parseFormals(symbols)
于 2012-05-07T08:49:10.530 回答
6

Go 不允许这样做。您需要单独转换NodeSymbol

[]Node不允许它的原因是它[]Symbol具有不同的表示形式,因此转换需要为[]Symbol.

于 2012-05-07T08:38:42.623 回答