github.com/traefik/yaegi@v0.15.1/_test/issue-1425.go (about)

     1  package main
     2  
     3  import (
     4  	"io"
     5  	"log"
     6  	"os"
     7  	"strings"
     8  )
     9  
    10  type WrappedReader struct {
    11  	reader io.Reader
    12  }
    13  
    14  func (wr WrappedReader) Read(p []byte) (n int, err error) {
    15  	return wr.reader.Read(p)
    16  }
    17  
    18  // Of course, this implementation is completely stupid because it does not write
    19  // to the intended writer, as any honest WriteTo implementation should. its
    20  // implemtion is just to make obvious the divergence of behaviour with yaegi.
    21  func (wr WrappedReader) WriteTo(w io.Writer) (n int64, err error) {
    22  	// Ignore w, send to Stdout to prove whether this WriteTo is used.
    23  	data, err := io.ReadAll(wr)
    24  	if err != nil {
    25  		return 0, err
    26  	}
    27  	nn, err := os.Stdout.Write(data)
    28  	return int64(nn), err
    29  }
    30  
    31  func main() {
    32  	f := strings.NewReader("hello world")
    33  	wr := WrappedReader{reader: f}
    34  
    35  	// behind the scenes, io.Copy is supposed to use wr.WriteTo if the implementation exists.
    36  	// With Go, it works as expected, i.e. the output is sent to os.Stdout.
    37  	// With Yaegi, it doesn't, i.e. the output is sent to io.Discard.
    38  	if _, err := io.Copy(io.Discard, wr); err != nil {
    39  		log.Fatal(err)
    40  	}
    41  }
    42  
    43  // Output:
    44  // hello world