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