github.com/traefik/yaegi@v0.15.1/_test/issue-558.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "log" 7 "strings" 8 ) 9 10 type readAutoCloser struct { 11 r io.ReadCloser 12 } 13 14 func (a readAutoCloser) Read(b []byte) (n int, err error) { 15 if a.r == nil { 16 return 0, io.EOF 17 } 18 n, err = a.r.Read(b) 19 if err == io.EOF { 20 a.Close() 21 } 22 return n, err 23 } 24 25 func (a readAutoCloser) Close() error { 26 if a.r == nil { 27 return nil 28 } 29 return a.r.(io.Closer).Close() 30 } 31 32 type pipe struct { 33 Reader readAutoCloser 34 } 35 36 func newReadAutoCloser(r io.Reader) readAutoCloser { 37 if _, ok := r.(io.Closer); !ok { 38 return readAutoCloser{io.NopCloser(r)} 39 } 40 return readAutoCloser{r.(io.ReadCloser)} 41 } 42 43 func main() { 44 p := &pipe{} 45 p.Reader = newReadAutoCloser(strings.NewReader("test")) 46 b, err := io.ReadAll(p.Reader) 47 if err != nil { 48 log.Fatal(err) 49 } 50 fmt.Println(string(b)) 51 } 52 53 // Output: 54 // test