为了账号安全,请及时绑定邮箱和手机立即绑定

我可以输入断言一片接口值吗?

我可以输入断言一片接口值吗?

Go
慕标5832272 2021-05-06 14:10:52
我正在尝试将assert从a键入[]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)我相信这是有充分的理由的。最好的进行方法是什么?
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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


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


我知道您来自哪里。这可能是一个有用的快捷方式,但没有任何意义。有点像期望syms.Method()当symstype是[]Symboland Methodfor时工作Symbol。


用此代码替换第47行,您可以执行以下操作:


symbols := make([]Symbol, len(args))

for i, arg := range args { symbols[i] = arg.(Symbol) }

fixed, rest := parseFormals(symbols)


查看完整回答
反对 回复 2021-05-10
?
喵喔喔

TA贡献1735条经验 获得超5个赞

Go不允许这样做。你需要转换NodeSymbol个别。

之所以不允许这样做[]Node,是因为它们[]Symbol具有不同的表示形式,因此转换将需要为分配内存[]Symbol


查看完整回答
反对 回复 2021-05-10
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信