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>