我正在尝试从[]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)
我确信这是有充分理由的。什么是最好的方法?
答案 0 :(得分:16)
在说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)
答案 1 :(得分:5)
Go不允许这样做。您需要单独将Node
转换为Symbol
。
不允许这样做的原因是[]Node
和[]Symbol
具有不同的表示形式,因此转换需要为[]Symbol
分配内存。