diff --git a/book_with_bridge/channels/go.mod b/book_with_bridge/channels/go.mod new file mode 100644 index 0000000..1da823a --- /dev/null +++ b/book_with_bridge/channels/go.mod @@ -0,0 +1,3 @@ +module main + +go 1.24.5 diff --git a/book_with_bridge/channels/launch!/go.mod b/book_with_bridge/channels/launch!/go.mod new file mode 100644 index 0000000..1da823a --- /dev/null +++ b/book_with_bridge/channels/launch!/go.mod @@ -0,0 +1,3 @@ +module main + +go 1.24.5 diff --git a/book_with_bridge/channels/launch!/main.go b/book_with_bridge/channels/launch!/main.go new file mode 100644 index 0000000..f99bed6 --- /dev/null +++ b/book_with_bridge/channels/launch!/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "os" + "time" +) + + +func launch() { + fmt.Println("To abort launch press Enter") + for i:=10;i >=0; i-- { + fmt.Printf("%d...\n",i) + } +} + +func main() { + abort := make(chan struct{}) + + go func() { + os.Stdin.Read(make([]byte,1)) + abort <- struct{}{} + }() + + tick := time.Tick(1*time.Second) + + for i:=10; i>=0; i-- { + fmt.Printf("%d...\n",i) + select { + case <-tick: + case <- abort: + fmt.Println("Launch cancelled") + return + } + } +} \ No newline at end of file diff --git a/book_with_bridge/channels/main.go b/book_with_bridge/channels/main.go new file mode 100644 index 0000000..7863b4b --- /dev/null +++ b/book_with_bridge/channels/main.go @@ -0,0 +1,26 @@ +package main + +import "fmt" + +func kek(i int) { + res_string := "" + for range i { + res_string += " " + } + fmt.Println(res_string,i) +} + +func main() { + done := make(chan int) + + for i:=range 10 { + go func() { + kek(i) + done <- 1 + }() + } + for range 10 { + <- done + } + +} \ No newline at end of file diff --git a/book_with_bridge/interfaces/reverb_client/main.go b/book_with_bridge/interfaces/reverb_client/main.go index c304ba4..9d0904e 100644 --- a/book_with_bridge/interfaces/reverb_client/main.go +++ b/book_with_bridge/interfaces/reverb_client/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "io" "log" "net" @@ -9,7 +10,7 @@ import ( func mustCopy(dst io.Writer,src io.Reader) { if _,err := io.Copy(dst,src); err != nil { - log.Fatalf("Error in mustCopy",err) + log.Fatalf("Error in mustCopy %s",err) } } @@ -20,7 +21,14 @@ func main() { log.Fatalf("Error in Dial %s",err) } defer conn.Close() + done := make(chan struct{}) - go mustCopy(os.Stdout,conn) - mustCopy(conn,os.Stdin) + go func() { + io.Copy(os.Stdin,conn) + fmt.Println("done") + done <- struct{}{} + }() + io.Copy(conn,os.Stdout) + conn.Close() + <-done } \ No newline at end of file diff --git a/book_with_bridge/interfaces/reverb_server/main.go b/book_with_bridge/interfaces/reverb_server/main.go index e00889b..9cc4a4e 100644 --- a/book_with_bridge/interfaces/reverb_server/main.go +++ b/book_with_bridge/interfaces/reverb_server/main.go @@ -10,23 +10,46 @@ import ( ) func echo(c net.Conn, shout string, t time.Duration) { - fmt.Fprintln(c, "\t", strings.ToUpper(shout)) - time.Sleep(t) - fmt.Fprintln(c, "\t", shout) - time.Sleep(t) - fmt.Fprintln(c, "\t", strings.ToLower(shout)) + for _ = range 3 { + fmt.Fprintln(c, "\t", strings.ToUpper(shout)) + time.Sleep(t) + } } func handleConn(conn net.Conn) { + + count := 1 defer fmt.Println("CLosed Connection") defer conn.Close() fmt.Println("Accepted connection") + + ticker := time.NewTicker(2*time.Second) + input := bufio.NewScanner(conn) - for input.Scan() { - go echo(conn, input.Text(), 1*time.Second) + select { + case <- ticker.C: + fmt.Println("TIMEOUT") + default: + fmt.Println("DEFAULT") } + for input.Scan() { + fmt.Println("TICK") + switch input.Text() { + case "info": + fmt.Printf("INFO %d",count) + default: + count++ + go func() { + defer func (){ + count-- + }() + echo(conn, input.Text(), 1*time.Second) + }() + + } + } } func main() {