108 lines
2.6 KiB
Go
108 lines
2.6 KiB
Go
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)
|
|
// }
|