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