23

[]Node、からにassertと入力しようとしてい[]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)

これには正当な理由があると確信しています。続行するための最良の方法は何ですか?

4

2 に答える 2

24

x.(T)変数はインターフェイスタイプである必要がxあります。これは、タイプの変数の場合のみ、インターフェイスの動的タイプが固定されていないためです。そして、Nodeはインターフェースですが、そうで[]Nodeはありません。スライスは、別個の非インターフェースタイプです。したがって、インターフェイス値のスライスもインターフェイスであると想定するのは意味がありません。

タイプNodeはコード内で明確に定義されているため、インターフェースです。そのためのメソッドのリストを指定しました。タイプ[]Nodeはそのようではありません。それはどのような方法を定義していますか?

私はあなたがこれでどこから来ているのか理解しています。これは便利なショートカットかもしれませんが、意味がありません。これは、のタイプがであるsyms.Method()ときに機能することを期待しているようなものです。syms[]SymbolMethodSymbol

行47をこのコードに置き換えると、必要な処理が実行されます。

symbols := make([]Symbol, len(args))
for i, arg := range args { symbols[i] = arg.(Symbol) }
fixed, rest := parseFormals(symbols)
于 2012-05-07T08:49:10.530 に答える
6

Goはこれを許可していません。個別に変換Nodeする必要があります。Symbol

許可されない理由は、[]Node[]Symbolが異なる表現を持っているため、変換ではにメモリを割り当てる必要があるため[]Symbolです。

于 2012-05-07T08:38:42.623 に答える