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>