Save IntCounter interface experiments.
authorsgf <sgf.dma@gmail.com>
Tue, 21 Jun 2022 21:18:58 +0000 (00:18 +0300)
committersgf <sgf.dma@gmail.com>
Tue, 21 Jun 2022 21:18:58 +0000 (00:18 +0300)
int.go [new file with mode: 0644]

diff --git a/int.go b/int.go
new file mode 100644 (file)
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
+}
+