Tengo que admitir, es la primera vez que veo trabajar algo asi xD es increible como funciona go, definitivamente tengo nuevo lenguaje favorito.
Ahora entiendo cuál es el propósito de existir de Go.
Al principio no le ví nada de diferencia a C.
Usar APIs con mejores queues.
En el mundo de los Sistemas Operativos, a esto se le conoce como Semáforos 😄
Una forma de sincronizar que proceso tendra que recurso y por cuanto tiempo
Los canales son tipos a los que solo se les puede referenciar. En go estos son los tipos de dato que siempre serán referencia y no copia:
slices
maps
channels
pointers
functions
Go tiene gran potencial cuando se usa sobre sistemas concurrentes:
package main
import"fmt"import"time"func ping(ball chan<- int, action chan<- string){ ball <-1 action <-"Player ping"}func pong(ball chan<- int, action chan<- string){ ball <-2 action <-"Player pong"}func referee(action <-chan string){for{ fmt.Println("Action: ",<- action)}}func pingpong(){ball:=make(chan int)action:=make(chan string) go referee(action) go ping(ball, action)for{value:=<- ball
switch value {case1: go pong(ball, action)case2: go ping(ball, action)}}}func main(){ go pingpong() time.Sleep(10* time.Second);}
Ejemplo de Buffered Channels:
Ademas como se sincronizan:
Interesante ejemplo.
la variable value no es necesaria , no ?
asi no tienes que usar value
for{switch<-ball {case1: go pong(ball, action)case2: go ping(ball, action)}}```
Una forma más corta y óptima de hacer lo mismo
package main
import("fmt""time")func ping(action chan<- string){ defer pong(action) action <-"Ping"}func pong(action chan<- string){ defer ping(action) action <-"Pong"}func referee(action <-chan string){for{ fmt.Println("Acción: ",<-action) time.Sleep(500* time.Millisecond)}}func pingpong(){action:=make(chan string,1) go referee(action) go ping(action)}func main(){ go pingpong() time.Sleep(10* time.Second)}
Esta es mi versión de Ping Pong con ganador
package main
import("fmt""math/rand")constMAX_POINT=7constREL_POINT=6func isPoint() int {isPoint:= rand.Intn(REL_POINT)switch isPoint {case1:return1default:return0}}func score(pointsA *int, pointsB *int){ fmt.Print("Score: Ping: ",*pointsA," VS Pong: ",*pointsB,"\n")}func ping(ball chan<- int, action chan<- string, player string){ ball <-1 action <-"ping "+player
}func pong(ball chan<- int, action chan<- string, player string){ ball <-2 action <-"pong "+player
}func referee(action <-chan string, pointsA *int, pointsB *int){for{ fmt.Println("Action: ",<-action)}}func pingpong(){var player1 string
var player2 string
fmt.Println("Ingrese nombre de Jugador 1: ") fmt.Scanf("%s",&player1) fmt.Println("Ingrese nombre de Jugador 2: ") fmt.Scanf("%s",&player2)ball:=make(chan int)action:=make(chan string)pointsA:=0pointsB:=0 go referee(action,&pointsA,&pointsB) go ping(ball, action, player1)for pointsA <MAX_POINT&& pointsB <MAX_POINT{value:=<-ball
switch value {case1: go pong(ball, action, player2) pointsB = pointsB +isPoint()case2: go ping(ball, action, player1) pointsA = pointsA +isPoint()}} defer func(){score(&pointsA,&pointsB)if pointsA > pointsB { fmt.Printf("%s es el Ganador \n",player1)}else{ fmt.Printf("%s es el Ganador \n",player2)}}()}func main(){pingpong()}