golang の使用html/template
( と同じ動作text/template
)。インターフェイス型のメンバーを持つ構造体がある場合、基になる型のメンバーにアクセスできません (具体的には、インターフェイスを実装しているが、構造体型ではなくインターフェイス型InnerInterface
を介して返される構造体にあるフィールドにアクセスしようとしています)。 InnerInterface
.
http://play.golang.org/p/ZH8wSK83oM
package main
import "fmt"
import "os"
import "html/template"
type InnerInterface interface{ InnerSomeMethod() }
type MyInnerStruct struct { Title string }
func (mis MyInnerStruct)InnerSomeMethod() { fmt.Println("Just to show we're satisfying the interface") }
type MyOuterStruct struct { Inner InnerInterface }
func main() {
fmt.Println("Starting")
arg := MyOuterStruct{Inner:MyInnerStruct{Title:"test1"}}
err := template.Must(template.New("testtmpl").Parse("{{.Inner.Title}}")).Execute(os.Stdout, arg)
if err != nil { panic(err) }
}
変更:type MyOuterStruct struct { Inner InnerInterface }
完全に一般的なインターフェイスに変更します。つまりtype MyOuterStruct struct { Inner interface{} }
、適切にレンダリングします。interface{}
これは、レンダリング エンジンによって特別に処理されていると思われます。
interface{}
このようなフィールドを動的に評価できるようにしたいときはいつでも使用するよりも、これを行うためのより良い方法はありますか?