learning_go/book_with_bridge/interfaces/main.go
2025-12-30 21:55:12 +03:00

124 lines
2.3 KiB
Go

package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
"strings"
"time"
)
type ByteCount int
func (bc *ByteCount) Write(p []byte) (n int,err error) {
*bc = ByteCount(len(p))
return len(p),nil
}
type WordsNum int
func (wn *WordsNum) Write(p []byte) (n int,err error) {
*wn = WordsNum(len(p))
return len(p),nil
}
func Count() []byte {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Enter text here: ")
if scanner.Scan() {
line := scanner.Text()
wordCount := bufio.NewScanner(strings.NewReader(line))
wordCount.Split(bufio.ScanWords)
wordsNum := []byte{}
for wordCount.Scan() {
wordsNum = append(wordsNum, 1)
fmt.Println("Word is: ",wordCount.Text())
}
fmt.Printf("Amount of words is %d\n",wordsNum)
return wordsNum
}
return nil
}
type NewWriter struct {
writer io.Writer
counter *int64
}
func (nw *NewWriter) Write(p []byte) (n int,err error) {
n,err = nw.writer.Write(p)
fmt.Println()
*nw.counter = int64(n)
return n,err
}
func CountingWriter(w io.Writer) (io.Writer, *int64) {
counter := int64(0)
return &NewWriter{
writer: w,
counter: &counter,
},&counter
}
// Упражнения на возврат LimitReader
func GetNewReader(s string) io.Reader {
return strings.NewReader(s)
}
type MyReader struct {
reader io.Reader
constraint int
}
func (nr MyReader) Read(p []byte) (n int,err error) {
n,err = nr.reader.Read(p[:nr.constraint])
return
}
func LimitReader(r io.Reader,n int) io.Reader {
return MyReader{
reader: r,
constraint: n,
}
}
// Проверка, что ByteCount действительно соответствует интерфейсу io.Writer
var _ io.Writer = new(ByteCount)
var period = flag.Duration("period",1 * time.Second,"sleep period")
func main() {
flag.Parse()
fmt.Printf("Waiting %v...",period)
time.Sleep(*period)
fmt.Println()
// var bc ByteCount
// bc.Write([]byte("Hello dodik"))
// fmt.Println(bc)
// var wn WordsNum
// wn.Write(Count())
// fmt.Println(wn)
// writer,count := CountingWriter(os.Stdout)
// writer.Write([]byte("Hello Baga"))
// fmt.Printf("Bytes %d",*count)
// str := "hello"
// buf := make([]byte,100)
// reader := LimitReader(strings.NewReader(str),3)
// // n,_ := reader.Read(buf)
// // reader := strings.NewReader(str)
// n,_ := reader.Read(buf)
// fmt.Printf("Result is %d\n",n)
// fmt.Printf("String is %s",string(buf))
}