Added ping-pong exercise to practice goroutines

Currently trying to figure out concurrency without suffering a headache,
stay tuned for more black magic using channels
This commit is contained in:
Raul 2024-03-08 08:22:28 +00:00
parent 8b87cce11c
commit 1279df8aab
2 changed files with 110 additions and 0 deletions

3
ping-pong/go.mod Normal file
View File

@ -0,0 +1,3 @@
module ping-pong
go 1.22.1

107
ping-pong/main.go Normal file
View File

@ -0,0 +1,107 @@
package main
import (
"fmt"
"time"
)
var ball int = 0
// Credits to this tutorial for actually teaching how to work with channels
// https://riptutorial.com/go/example/6056/ping-pong-with-two-goroutines
// Okay so from what I'm gathering here, the function input for the channel takes in an arrow depending on whether
// or not it's getting a value from the channel, or sending a value into the channel, here it's pulling from
// pingChan since the arrow is at the left
// For the second input value it's gonna be pulling the value from the pong Channel instead of sending to it
func ping(pingChan <-chan int, pongChan chan<- int) {
for {
<-pingChan
fmt.Println("PING:", ball)
fmt.Printf("Current goroutine: %v\n\n", pingChan)
ball = ball + 1
time.Sleep(time.Second)
// Instead of calling each other's function, we seem to initialize each goroutine by directing a value
// into its channel
pongChan <- 1
}
}
// Over here it should be opposite, since the ping func sends its value into pingChan, then here we need to
// pull the value from pingChan, and in the case of pongChan it's the opposite
func pong(pingChan chan<- int, pongChan <-chan int) {
for {
<-pongChan
fmt.Println("PONG:", ball)
fmt.Printf("Current goroutine: %v\n\n", pongChan)
ball = ball + 1
time.Sleep(time.Second)
pingChan <- 1
}
}
// This is some black magic
func main() {
// Here we initialize both channels, and provide both to each function called through "go"
pingChannel := make(chan int)
pongChannel := make(chan int)
go ping(pingChannel, pongChannel)
go pong(pingChannel, pongChannel)
// Now we're just initalizing them with a 1
pingChannel <- 1
for {
time.Sleep(time.Second)
if ball >= 10 {
break
}
}
fmt.Println("Finished")
}
// WARNING: Do not read the following if you don't wish to have your retinas burned!
// var pingChannel chan int
// var ball int
//
// func main() {
// pingChannel := make(chan int)
// fmt.Println("Hello world")
// ball := 0
// go ping(pingChannel)
// //go pong(ball, pingChannel)
// ping <- 1
//
// for {
// if ball >= 10 {
// fmt.Println("Ball value above 10")
// os.Exit(0)
// }
// }
// }
//
// func ping(ballChannel <-chan int, ponger chan<- int) {
// pingChannel := make(chan int)
//
// ball = <-ballChannel
// fmt.Println("PING", ball)
// ball = +1
//
// ballChannel <- ball
// go pong(pingChannel)
// }
//
// func pong(ballChannel chan int, ponger chan<- int) {
// pingChannel := make(chan int)
//
// ball = <-ballChannel
// fmt.Println("PONG", ball)
//
// ballChannel <- ball
// go ping(pingChannel)
// }