package main import ( "errors" "fmt" ) func main() { if x, e := DOCFactory("XXX"); e == nil { x.Summary() } else { fmt.Println(e.Error()) } } type Article struct{ Topic string } type News struct{ Title string } type Doc interface{ Summary() } func (a Article) Summary() { fmt.Printf("Article topic is %s", a.Topic) } func (n News) Summary() { fmt.Printf("News title is %s", n.Title) } func DOCFactory(t string) (Doc, error) { switch t { case "Article": return Article{"aaa"}, nil case "News": return News{"bbb"}, nil default: return nil, errors.New("no such struct") } }