--- /dev/null
+
+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
+}
+