我正在尝试从 []Node
到 []Symbol
键入断言。在我的代码中,Symbol
实现了 Node
接口(interface)。
这里是一些周边代码:
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)
我相信这是有充分理由的。最好的方法是什么?
最佳答案
在说x.(T)
变量x
应该是接口(interface)类型的,因为只针对接口(interface)类型的变量动态类型是不固定的。虽然 Node
是一个接口(interface),但 []Node
不是。 slice 是一种独特的非接口(interface)类型。所以假设接口(interface)值的一部分也是一个接口(interface)是没有意义的。
Type Node
在你的代码中有明确的定义,因此是一个接口(interface)。您已经为其指定了方法列表。类型 []Node
不是那样的。它定义了哪些方法?
我了解您的出处。这可能是一个有用的捷径,但没有任何意义。这有点像期望 syms.Method()
在 syms
的类型是 []Symbol
和 Method
时工作> 代表符号
。
用此代码替换第 47 行即可:
symbols := make([]Symbol, len(args))
for i, arg := range args { symbols[i] = arg.(Symbol) }
fixed, rest := parseFormals(symbols)
关于interface - 我可以键入断言一部分接口(interface)值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10478641/