我正在尝试将assert从a键入[]Node到[]Symbol。在我的代码中,Symbol实现Node接口。
[]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)
我相信这是有充分的理由的。最好的进行方法是什么?
在说x.(T)变量x应该是接口类型的,因为仅对于类型的变量,接口的动态类型是不固定的。虽然Node是接口,但[]Node不是。切片是一种独特的非接口类型。因此,假设一片接口值也是一个接口也没有意义。
x.(T)
x
类型Node在您的代码中有明确的定义,因此是一个接口。您已经为其指定了方法列表。类型[]Node不是那样。它定义什么方法?
我知道您来自哪里。这可能是一个有用的快捷方式,但没有任何意义。有点像期望syms.Method()当symstype是[]Symboland Methodfor时工作Symbol。
syms.Method()
syms
Method
用此代码替换第47行,您可以执行以下操作:
symbols := make([]Symbol, len(args)) for i, arg := range args { symbols[i] = arg.(Symbol) } fixed, rest := parseFormals(symbols)