sân chơi liên kết: http://play.golang.org/p/Ebf5AuJlcPSự hiện diện của phương pháp không liên quan trong giao diện ngắt văn bản/mẫu?
type Foo interface {}
type Bar interface {
ThisIsABar()
}
// Person implements both Foo and Bar
type Person struct {
Name string
}
func (p Person) ThisIsABar() {}
type FooContext struct {
Something Foo
}
type BarContext struct {
Something Bar
}
func main() {
t := template.Must(template.New("test").Parse("{{ .Something.Name }}\n"))
// This works fine.
if err := t.Execute(os.Stdout, FooContext{Person{"Timmy"}}); err != nil {
fmt.Printf("Error: %s\n", err)
}
// With BarContext, containing the exact same Person but wrapped in a
// different interface, it errors out.
if err := t.Execute(os.Stdout, BarContext{Person{"Timmy"}}); err != nil {
fmt.Printf("Error: %s\n", err)
}
}
Khi tôi làm một bản mẫu (thông qua các gói text/template
) chứa {{ .Something.Name }}
, tôi có thể đi qua giao diện Foo
mà không chứa các phương pháp, và nó hoạt động tốt. Nhưng nếu tôi đi qua giao diện Bar
thay vào đó, tôi nhận được:
executing "test" at <.Something.Name>: can't evaluate field Name in type main.Bar
Tại sao sự hiện diện của một phương pháp không liên quan về giao diện, mà thậm chí không được sử dụng, ảnh hưởng đến việc vẽ của mẫu không?
bản sao có thể có của [mẫu sẽ không đánh giá các trường là loại giao diện dưới dạng kiểu cơ bản] (http://stackoverflow.com/questions/19554209/template-wont-evaluate-fields-that-are-interface-type -as-the-base-type) – nemo