github.com/switchupcb/yaegi@v0.10.2/_test/issue-1260.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 ) 9 10 type WriteSyncer interface { 11 io.Writer 12 Sync() error 13 } 14 15 type Sink interface { 16 WriteSyncer 17 io.Closer 18 } 19 20 func newFileSink(path string) (Sink, error) { 21 return os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) 22 } 23 24 type Sink1 struct{ name string } 25 26 func (s Sink1) Write(b []byte) (int, error) { println("in Write"); return 0, nil } 27 func (s Sink1) Sync() error { println("in Sync"); return nil } 28 func (s Sink1) Close() error { println("in Close", s.name); return nil } 29 func newS1(name string) Sink { return Sink1{name} } 30 func newS1p(name string) Sink { return &Sink1{name} } 31 32 type Sink2 struct{ name string } 33 34 func (s *Sink2) Write(b []byte) (int, error) { println("in Write"); return 0, nil } 35 func (s *Sink2) Sync() error { println("in Sync"); return nil } 36 func (s *Sink2) Close() error { println("in Close", s.name); return nil } 37 func newS2(name string) Sink { return Sink1{name} } 38 39 func main() { 40 tmpfile, err := ioutil.TempFile("", "xxx") 41 if err != nil { 42 panic(err) 43 } 44 defer os.Remove(tmpfile.Name()) 45 closers := []io.Closer{} 46 sink, err := newFileSink(tmpfile.Name()) 47 if err != nil { 48 panic(err) 49 } 50 closers = append(closers, sink) 51 52 s1p := newS1p("ptr") 53 s1 := newS1("struct") 54 s2 := newS2("ptr2") 55 closers = append(closers, s1p, s1, s2) 56 for _, closer := range closers { 57 fmt.Println(closer.Close()) 58 } 59 } 60 61 // Output: 62 // <nil> 63 // in Close ptr 64 // <nil> 65 // in Close struct 66 // <nil> 67 // in Close ptr2 68 // <nil>