interface - 我可以键入断言一部分接口(interface)值吗?

标签 interface type-conversion go type-assertion

我正在尝试从 []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 的类型是 []SymbolMethod 时工作> 代表符号

用此代码替换第 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/

相关文章:

java - JFrame 在窗口大小最大化之前不会更新

java - 为什么接口(interface)对于创建 RMI 应用程序很重要?

c - 以下代码有哪些潜在问题?短 foo() { 短 a,b,c; b=10; c = a + b;返回c; }

c# - 为接口(interface)定义方法定义

java - 找不到符号 listModel.addElement

time - 如何将字符串转换为TimeHour24?

c# - 如何在 C# 中将字符串转换为 "Null Terminated Byte Array"?

go - 在 Golang 中构建没有 GitHub 的本地导入

Docker GO 构建返回了一个非零代码 : 1

go - 如何从另一个函数中终止 http 服务器