From 1e49da2178ea1015399f6e8ae469ec67f0990009 Mon Sep 17 00:00:00 2001 From: sgf Date: Wed, 22 Jun 2022 00:18:58 +0300 Subject: [PATCH] Save IntCounter interface experiments. --- int.go | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 int.go diff --git a/int.go b/int.go new file mode 100644 index 0000000..3295b92 --- /dev/null +++ b/int.go @@ -0,0 +1,130 @@ + +package main + +import ( + "fmt" + "bytes" + "io" +) + +func main() { + myInt := IntCounter(0) + var inc Incrementer = &myInt + for i := 0; i < 10; i++ { + fmt.Println(inc.Increment()) + } + + var wc WriterCloser = NewBufferedWriterCloser() + wc.Write([]byte("Hello youtube listeners, this is a test")) + wc.Close() + + bwc := wc.(*BufferedWriterCloser) + fmt.Printf("%T\n", bwc) + + var myObj interface{} = NewBufferedWriterCloser() + if wc, ok := myObj.(WriterCloser); ok { + wc.Write([]byte("Yuuhuu, youtube listeners")) + wc.Close() + } else { + fmt.Println("a nihuya") + } + r, ok := myObj.(io.Reader) + if ok { + fmt.Println(r) + } else { + fmt.Println("Conversion failed") + } + + fmt.Println("*****") + + var wc2 WriterCloser = &myWriterCloser{} + fmt.Println(wc2) +} + +type Incrementer interface { + Increment() int +} + +type IntCounter int + +func (ic *IntCounter) Increment() int { + *ic++ + return int(*ic) +} + +type Writer interface { + Write([]byte) (int, error) +} + +type Closer interface { + Close() error +} + +type WriterCloser interface { + Writer + Closer +} + +type BufferedWriterCloser2 struct { +} + +func (bwc2 *BufferedWriterCloser2) Write(data []byte) (int, error) { + fmt.Println("huh") + return 1, nil +} + +func (bwc2 *BufferedWriterCloser2) Close() error { + fmt.Println("ergh") + return nil +} +type BufferedWriterCloser struct { + buffer *bytes.Buffer +} + +func (bwc *BufferedWriterCloser) Write(data []byte) (int, error) { + n, err := bwc.buffer.Write(data) + if err != nil { + return 0, err + } + + v := make([]byte, 8) + for bwc.buffer.Len() > 8 { + _, err := bwc.buffer.Read(v) + if err != nil { + return 0, err + } + _, err = fmt.Println(string(v)) + if err != nil { + return 0, err + } + } + return n, nil +} + +func (bwc *BufferedWriterCloser) Close() error { + for bwc.buffer.Len() > 0 { + data := bwc.buffer.Next(8) + _, err := fmt.Println(string(data)) + if err != nil { + return err + } + } + return nil +} + +func NewBufferedWriterCloser() *BufferedWriterCloser { + return &BufferedWriterCloser { + buffer: bytes.NewBuffer([]byte{}), + } +} + +type myWriterCloser struct {} + +func (mwc myWriterCloser) Write (data []byte) (int, error) { + return 0, nil +} + +func (mwc myWriterCloser) Close() error { + return nil +} + -- 2.20.1