実際のコードでは、encoding/xml
を使用してXMLドキュメントを解析しています。基本的には、次のフォームの入れ子構造がたくさんあります。—トップレベルstatements
要素:アイテムのコレクションに対してアクションを実行します。
statements
statement
opcode
args
pre
post
は私が行くためにかなり新たなんだ、とinterface{}
(空のインタフェース)がどのように動作するか私は明らかに誤解しています:
.\stmtgen.go:58: cannot use print_name (type func(Statement)) as type func(interface {}) in argument to performAction
.\stmtgen.go:58: cannot use slist (type []Statement) as type []interface {} in argument to performAction
関連するサンプルコード:
package main
import "fmt"
// Actually a structure in my code, but this suffices for demonstration.
type Opcode int
// A Statement has a Name and multiple Opcodes may use this Name.
type Statement struct {
Name string
Opcodes []Opcode
}
// Print the statement name.
func print_name(stmt Statement) {
fmt.Println(stmt.Name)
}
// Perform an action on each item of a collection.
func performAction(action func(interface{}), v []interface{}) {
for i := range v {
action(v[i])
}
}
func main() {
slist := make([]Statement, 3)
slist[0] = Statement{"Statement 1"}
slist[1] = Statement{"Statement 2"}
slist[2] = Statement{"Statement 3"}
//ERROR HERE
performAction(print_name, slist)
}
すべての種類の値を印刷する関数を作成する必要がありますか?
ゴーラこれはコストがかかり、構文上のコストのかかるプロセスを隠しているため、 '[]]文を' []インタフェース{} 'に暗黙的にキャストしてはいけません。 forループをperformActionに渡す前に(...) – nevernew