[ā§Ē.⧍] āĻā§āϝāĻžāύā§āϞ (Channels)
āĻāĻ āĻĒāϰā§āϝāĻžā§ā§ āĻāĻŽāϰāĻž Go āĻā§āϝāĻžāύā§āϞ āύāĻŋā§ā§ āĻāĻĨāĻž āĻŦāϞāĻŦā§āĨ¤ āĻā§āϝāĻžāύā§āϞ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻžāύāϤ⧠āĻšāϞ⧠āĻāĻā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāύāϤ⧠āĻšāĻŦā§ āĻā§āϝāĻžāύā§āϞ āĻā§, āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠āĻāĻŦāĻ āĻā§āύāĻ āĻŦāĻž āĻāĻŽāϰāĻž āĻā§āϝāĻžāύā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āĨ¤ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻŦāĻŋāώā§āĻā§āϞ⧠āĻĻā§āĻāĻž āϝāĻžāĻāĨ¤
[ā§Ē.⧍.ā§§] āĻā§āϝāĻžāύā§āϞ āĻā§ ?
Go āϤ⧠āĻā§āϝāĻžāύā§āϞ āĻšāϞ āĻĒāĻžāĻāĻĒ āϞāĻžāĻāύā§āϰ āĻŽāϤ⧠āϝāĻžāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻ āĻŦāĻž āĻāĻāĻžāϧāĻŋāĻ āĻā§-āϰā§āĻāĻŋāύ āύāĻŋāĻā§āĻĻā§āϰ āĻŽāϧā§āϝ⧠āϝā§āĻāĻžāϝā§āĻ āĻāϰā§āĨ¤ āĻŦāĻžāϏā§āϤāĻŦā§ āϝāĻĻāĻŋ āĻāĻŽāϰāĻž āĻĒāĻžāĻāĻĒ āϞāĻžāĻāύā§āϰ āĻĻāĻŋāĻā§ āϤāĻžāĻāĻžāĻ āϤāĻžāĻšāϞ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§ āĻĒāĻžāĻāĻĒ āϞāĻžāĻāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒāĻžāύāĻŋ āĻāĻ āĻĒā§āϰāĻžāύā§āϤ āĻĨā§āĻā§ āĻ āύā§āϝ āĻĒā§āϰāĻžāύā§āϤ⧠āĻĒā§āϰāĻŦāĻžāĻšāĻŋāϤ āĻšāĻā§āĻā§, āĻāĻāĻāĻāĻžāĻŦā§ āĻā§āϝāĻžāύā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻ āĻĒā§āϰāĻžāύā§āϤ āĻĨā§āĻā§ āĻĄāĻžāĻāĻž āĻĒāĻžāĻ āĻžāύ⧠āĻšā§ āĻāĻŦāĻ āĻ āύā§āϝ āĻĒā§āϰāĻžāύā§āϤ āĻĨā§āĻā§ āĻĄāĻžāĻāĻž āĻā§āϰāĻšāĻŖ āĻāϰāĻž āĻšā§āĨ¤Â Go āϤ⧠āĻĻā§āĻ āϧāϰāύā§āϰ āĻā§āϝāĻžāύā§āϞ āϰā§ā§āĻā§, buffered āĻā§āϝāĻžāύā§āϞ āĻāĻŦāĻ unbuffered āĻā§āϝāĻžāύā§āϞāĨ¤ āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻāĻŽāϰāĻž buffered āĻāĻŦāĻ unbuffered āĻā§āϝāĻžāύā§āϞ āύāĻŋā§ā§ āĻāϞā§āĻāύāĻž āĻāϰāĻŦā§āĨ¤
[ā§Ē.⧍.⧍] āĻā§āύ āĻā§āϝāĻžāύā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§ ?
- āĻāĻāĻžāϧāĻŋāĻ āĻā§-āϰā§āĻāĻŋāύā§āϰ āĻŽāϧā§āϝ⧠āϝā§āĻāĻžāϝā§āĻ āϏāĻšāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ Â āĻĄāĻžāĻāĻž āĻā§āϰāĻžāύā§āϏāĻĢāĻžāϰā§āϰ āĻāύā§āϝ āĻā§āϝāĻžāύā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§āĨ¤
- Go āϤ⧠āĻā§āϝāĻžāύā§āϞā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ ā§āϝāĻžāϏāĻŋāĻā§āĻā§āϰā§āύāĻžāϏ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻāĻā§ āϏāĻšāĻ āĻāϰ⧠āϤā§āϞā§āĨ¤
- Go āϤ⧠āĻā§āϝāĻžāύā§āϞā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāĻāĻžāϧāĻŋāĻ āĻĢāĻžāĻāĻļāύ āĻŦāĻž āĻŽā§āĻĨāĻĄāĻā§ āĻāĻāĻāϏāĻžāĻĨā§ āϰāĻžāύ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤
[ā§Ē.⧍.ā§Š] āĻā§āϝāĻžāύā§āϞ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ
āĻĒā§āϰāϤā§āϝā§āĻāĻāĻŋ āĻā§āϝāĻžāύā§āϞ āĻāϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻžāĻāĻĒ āĻāϏā§āϏāĻŋā§ā§āĻā§āĻĄ āĻĨāĻžāĻā§āĨ¤ āĻāĻāĻāĻŋ āĻā§āϝāĻžāύā§āϞ⧠āĻļā§āϧ⧠āĻāĻāĻ āĻāĻžāĻāĻĒā§āϰ āĻĄāĻžāĻāĻž āĻā§āϰāĻžāύā§āϏāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻ āύā§āϝ āĻāĻžāĻāĻĒā§āϰ āĻĄāĻžāĻāĻžāĻā§ āĻāϞāĻžāĻ āĻāϰ⧠āύāĻžāĨ¤ āĻā§āϝāĻžāύā§āϞ āĻ āĻā§āϝāĻžāϞ⧠āϰāĻŋāϏāĻŋāĻ āĻāĻŦāĻ āϏā§āύā§āĻĄā§āϰ āĻāύā§āϝ <- āĻ āĻĒāĻžāϰā§āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§āĨ¤
āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ :
myChannel := make(chan datatype)
āϝāĻĻāĻŋ āĻā§āϝāĻžāύā§āϞ⧠āĻā§āύ āĻŽāĻžāύ āύāĻž āĻĨāĻžāĻā§ āϤāĻžāĻšāϞ⧠āϏā§āĻ āĻā§āϝāĻžāύā§āϞāĻā§ nil āĻā§āϝāĻžāύā§āϞ āĻŦāϞā§āĨ¤ nil āĻā§āϝāĻžāύā§āϞ āĻā§āύ āĻāĻžāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ āύāĻžāĨ¤ āϤāĻžāĻ āĻā§āϝāĻžāύā§āϞāĻā§Â maps āĻāĻŦāĻ āϏā§āϞāĻžāĻāϏ āĻāϰ āĻŽāϤ make āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĄāĻŋāĻĢāĻžāĻāύ āĻāϰāĻž āĻšā§āĨ¤
āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻž āϝāĻžāĻ :
package main
import "fmt"
func main() {
var ch chan int
if ch == nil {
fmt.Println("channel ch is nil, Going to define it")
ch = make(chan int)
fmt.Printf("Type of a is %T", ch)
}
}
Output :
channel ch is nil, Going to define it
Type of ch is chan int
āĻāĻĒāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ nil āĻā§āϝāĻžāύā§āϞ ch āĻĄāĻŋāĻĢāĻžāĻāύ āĻāϰā§āĻāĻŋ, āϤāĻžāϰāĻĒāϰ āĻā§āĻ āĻāϰā§āĻāĻŋ ch nil āĻāĻŋāύāĻžāĨ¤ āϝā§āĻšā§āϤ⧠ch āĻāĻāĻāĻž nil āĻā§āϝāĻžāύā§āϞ āϤāĻžāĻ if āĻāϰ āĻāĻŋāϤāϰ⧠āĻĒā§āϰāĻŦā§āĻļ āĻāϰā§āĻā§ âchannel ch is nil, Going to define itâ āĻĒā§āϰāĻŋāύā§āĻ āĻšā§ā§āĻā§, āϤāĻžāϰāĻĒāϰ make āĻĻāĻŋā§ā§ āĻā§āϝāĻžāύā§āϞ ch āĻā§ āĻĄāĻŋāĻĢāĻžāĻāύ āĻāϰāĻž āĻšā§ā§āĻā§ āĻāĻŦāĻ āĻā§āϝāĻžāύā§āϞ ch āĻāϰ āĻāĻžāĻāĻĒ āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤Â
 āύāĻŋāĻŽā§āύā§āϰ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻā§āϝāĻžāύā§āϞ⧠āĻĄāĻžāĻāĻž āϏā§āύā§āĻĄ āĻāĻŦāĻ āϰāĻŋāϏāĻŋāĻ āĻšā§ā§ āĻĨāĻžāĻā§ :Â
ch <- data // write or send to channel a
data := <- ch // read or receive from channel a
āĻā§āϝāĻžāύā§āϞ āĻ āĻĄāĻžāĻāĻž āϏā§āύā§āĻĄ āĻāĻŦāĻ āϰāĻŋāϏāĻŋāĻ āĻŦāĻžāĻ āĻĄāĻŋāĻĢāϞā§āĻ āĻŦā§āϞāĻāĻŋāĻ āĻšā§ā§ āĻĨāĻžāĻā§āĨ¤ āĻ āϰā§āĻĨāĻžā§ āϝāĻāύ āĻĄāĻžāĻāĻž āϏā§āύā§āĻĄ āĻāϰāĻž āĻšā§ āĻā§-āϰā§āĻāĻŋāύ āϏā§āĻāĻž āϰāĻŋāϏāĻŋāĻ āĻāϰāĻžāϰ āĻāĻ āĻĒāϰā§āϝāύā§āϤ āĻā§āϝāĻžāύā§āϞ āĻāĻŋ āĻŦā§āϞāĻ āĻĨāĻžāĻā§āĨ¤ āĻāĻāĻ āĻāĻžāĻŦā§ āĻĄāĻžāĻāĻž āϰāĻŋāϏāĻŋāĻ āύāĻž āĻšāĻā§āĻž āĻĒāϰā§āϝāύā§āϤ āĻĄāĻžāĻāĻž āϏā§āύā§āĻĄ āĻŦāύā§āϧ āĻĨāĻžāĻā§ āĻ āϰā§āĻĨāĻžā§Â āĻā§āϝāĻžāύā§āϞ āĻŦā§āϞāĻ āĻĨāĻžāĻā§āĨ¤ āĻ āĻāύā§āϝāĻ āĻŦāϞāĻž āĻšā§ āĻā§āϝāĻžāύā§āϞ āĻŦāĻžāĻ āĻĄāĻŋāĻĢāϞā§āĻ āĻŦā§āϞāĻāĻŋāĻāĨ¤
āĻāĻāύ āĻāĻŋāĻā§ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻā§āϝāĻžāύā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āĻāĻŽāĻŋāĻāύāĻŋāĻā§āĻļāύ āĻŦā§āĻāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻŋāĨ¤ [4.1.2] āĻāϰ āĻĻā§āĻŦāĻŋāϤā§ā§ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻž āĻāĻŦāĻžāϰ āĻāĻŽāϰāĻž āĻā§āϝāĻžāύā§āϞ āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻāϰāĻŦā§ :Â
package main
import (
"fmt"
)
func hello(done chan bool) {
fmt.Println("Hello world Goroutine")
done <- true // signal that the work is done
}
func main() {
done := make(chan bool)
go hello(done)
<-done // wait for the Goroutine to finish
fmt.Println("main function")
}
// Output :
// Hello world Goroutine
// main function
āĻāĻĒāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§, done bool āύāĻžāĻŽā§ āĻā§āϝāĻžāύā§āϞ āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋ āϏā§āĻāĻž hello āĻā§-āϰā§āĻāĻŋāύ āĻ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻšāĻŋāϏā§āĻŦā§ āĻĒāĻžāϏ āĻāϰā§āĻāĻŋ, āĻĒāϰā§āϰ āϞāĻžāĻāύ⧠hello() āĻĨā§āĻā§ āĻĒāĻžāĻ āĻžāύ⧠āĻĄāĻžāĻāĻž <-done āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āϰāĻŋāϏāĻŋāĻ āĻāϰāϤā§āĻāĻŋ āϝāĻž done <- āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻĒāĻžāĻ āĻžāύ⧠āĻšā§ā§āĻāĻŋāϞāĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻā§-āϰā§āĻāĻŋāύ āĻĄāĻžāĻāĻž āϏā§āύā§āĻĄ āύāĻž āĻāϰāĻž āĻĒāϰā§āϝāύā§āϤ āĻŽā§āĻāύ āĻĢāĻžāĻāĻļāύ āĻŦā§āϞāĻ āĻ āĻŦāϏā§āĻĨāĻžā§ āĻĨāĻžāĻāĻŦā§āĨ¤ āĻāϤ⧠āĻāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāϰ time.Sleep() āϞāĻŋāĻā§ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāϤ⧠āĻŦāϞāĻž āϞāĻžāĻā§āύāĻŋ āĻāĻŦāĻ āĻŽā§āĻāύ āĻĢāĻžāĻāĻļāύ āϤāĻžāϰ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻļāύ āĻļā§āώ āĻāϰ⧠āĻĻā§ā§āύāĻŋāĨ¤Â Â
āĻāĻĒāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻāĻāĻā§ āĻŽāĻĄāĻŋāĻĢāĻžāĻ āĻāϰāĻž āϝāĻžāĻ :Â
package main
import (
"fmt"
"time"
)
func hello(done chan bool) {
fmt.Println("hello Go routine is Going to sleep")
time.Sleep(4 * time.Second)
fmt.Println("hello Go routine awake and Going to write to done")
done <- true // signal that the work is done
}
func main() {
done := make(chan bool)
fmt.Println("Main Going to call hello Go Goroutine")
go hello(done)
<-done // wait for the Goroutine to finish
fmt.Println("Main received data")
}
// Output :
// Main Going to call hello Go Goroutine
// hello Go routine is Going to sleep
// hello Go routine awake and Going to write to done
// Main received data
āĻāĻŦāĻžāϰ āϞāĻā§āώ āĻāϰāĻž āϝāĻžāĻ, āĻāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻĒā§āϰāĻĨāĻŽā§ âMain Going to call hello Go Goroutineâ āĻĒā§āϰāĻŋāύā§āĻ āĻšā§ā§āĻā§,āϤāĻžāϰāĻĒāϰ āĻā§-āϰā§āĻāĻŋāύ āϏā§āĻāĻžāϰā§āĻ āĻšā§ā§āĻā§ āĻāĻŦāĻ âhello Go routine is Going to sleepâ āĻĒā§āϰāĻŋāύā§āĻ āĻšā§ā§āĻā§āĨ¤ āĻāĻāĻŋ āĻĒā§āϰāĻŋāύā§āĻ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰā§, hello āĻā§-āϰā§āĻāĻŋāύ 4 āϏā§āĻā§āύā§āĻĄā§āϰ āĻāύā§āϝ Sleep āĻ āϝāĻžāĻŦā§ āĻāĻŦāĻ āĻāĻ āϏāĻŽāϝāĻŧā§āϰ āĻŽāϧā§āϝ⧠āĻŽā§āĻāύ āĻā§-āϰā§āĻāĻŋāύ āĻŦā§āϞāĻ āĻšāϝāĻŧā§ āϝāĻžāĻŦā§ āĻāĻžāϰāĻŖ āĻāĻāĻŋ āĻā§āϝāĻžāύā§āϞ āĻĨā§āĻā§ āϰā§āϏāĻĒāύā§āϏā§āϰ āĻāύā§āϝ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻā§āĨ¤ 4 āϏā§āĻā§āύā§āĻĄ āĻĒāϰ âhello Go routine awake and Going to write to doneâ āĻĒā§āϰāĻŋāύā§āĻ āĻšāĻŦā§ āĻāĻŦāĻ āϰā§āϏāĻĒāύā§āϏ āĻāϏāĻŦā§ āϤāĻāύ âMain received dataâ āĻĒā§āϰāĻŋāύā§āĻ āĻšāĻŦā§ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻŽā§āĻāύ āĻĢāĻžāĻāĻļāύāĻ āĻŦāύā§āϧ āĻšā§ā§ āϝāĻžāĻŦā§āĨ¤
[ā§Ē.⧍.ā§Ē] Unbuffered āĻā§āϝāĻžāύā§āĻ˛Â āĻā§ ?
āĻāĻŽāϰāĻž āĻāĻā§āĻ āĻŦāϞā§āĻāĻŋ āĻā§āϝāĻžāύā§āϞ āĻĻā§āĻ āĻĒā§āϰāĻāĻžāϰ Unbuffered āĻāĻŦāĻ Buffered āĻā§āϝāĻžāύā§āϞ āĨ¤ āĻāĻāύ āĻāĻŽāϰāĻž āĻāĻžāύāĻŦ Unbuffered āĻā§āϝāĻžāύā§āϞ āϏāĻŽā§āĻĒāϰā§āĻā§ āĨ¤ āĻāϏāϞ⧠āĻā§āϝāĻžāύā§āϞ āĻŦāĻžāĻ āĻĄāĻŋāĻĢāϞā§āĻ Unbuffered āĻĨāĻžāĻā§āĨ¤ Unbuffered āĻā§āϝāĻžāύā§āϞ āĻ āĻā§āϝāĻžāϞ⧠āϏā§āύā§āĻĄāĻŋāĻ (chan <- ) āĻāϰ āĻāϰā§āϏā§āĻĒāύā§āĻĄāĻŋāĻ āĻā§āϝāĻžāϞ⧠āϰāĻŋāϏāĻŋāĻāĻžāϰ (<- chan) āĻĨāĻžāĻāĻŦā§āĨ¤
package main
import (
"fmt"
"time"
)
// ---send data into a channel---
func sendData(ch chan string) {
fmt.Println("Sending a string into channel...")
ch <- "Hello"
fmt.Println("String has been retrieved from channel...")
}
// ---getting data from the channel---
func getData(ch chan string) {
time.Sleep(2 * time.Second)
fmt.Println("String retrieved from channel:", <-ch)
}
func main() {
ch := make(chan string)
go sendData(ch)
go getData(ch)
fmt.Scanln()
}
// Output :
// Sending a string into channel...
// String retrieved from channel: Hello
// String has been retrieved from channelâĻ
[ā§Ē.⧍.ā§Ģ] Buffered āĻā§āϝāĻžāύā§āĻ˛Â āĻā§ ?
Buffered āĻā§āϝāĻžāύā§āĻ˛Â āĻāĻ āϧāϰāύā§āϰ āĻā§āϝāĻžāύā§āϞ āϝāĻžāϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ Buffer āĻĨāĻžāĻāĻŦā§ āϝā§āĻāĻžāύ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻāĻā§āϝāĻ āĻā§āϝāĻžāϞ⧠āώā§āĻā§āϰ āĻāϰ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰ⧠āĻāϰā§āϏā§āĻĒāύā§āĻĄāĻŋāĻ āĻā§āύ āϰāĻŋāϏāĻŋāĻāĻžāϰ āĻāĻžā§āĻžāĻāĨ¤ āϝāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻāĻāĻŋ Go āϰā§āĻāĻŋāύ⧠āĻĄā§āĻāĻž āĻĒā§āϰāϏā§āϤā§āϤ āĻāϰāϤ⧠āĻšā§ āĻāĻŦāĻ āĻ āύā§āϝ Go āϰā§āĻāĻŋāύ⧠āĻĄā§āĻāĻž āϏāϰāĻŦāϰāĻžāĻš āĻāϰāϤ⧠āĻšā§ āϤāĻāύ āĻāĻŽāϰāĻž āĻŦāĻžāĻĢāĻžāϰ āĻā§āϝāĻžāύā§āϞāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤Â Â
Â
Buffered āĻā§āϝāĻžāύā§āϞ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ :Â
āĻāĻĻāĻžāĻšāϰāĻŖ :Â
package main
import (
"fmt"
)
func main() {
linkChannel := make(chan string, 5)
go ping(linkChannel)
fmt.Println(<-linkChannel)
fmt.Println(<-linkChannel)
fmt.Println(<-linkChannel)
}
func ping(c chan string) {
links := []string{"https://www.golinuxcloud.com/", "https://www.tesla.com/", "https://www.google.com/"}
for _, link := range links {
c <- link
}
}
// Output :
// https://www.golinuxcloud.com/
// https://www.tesla.com/
// https://www.google.com/
āĻāĻĒāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻāĻāĻāĻŋ buffered āĻā§āϝāĻžāύā§āϞ linkChannel āϝāĻž āĻā§-āϰā§āĻāĻŋāύ ping āĻāϰ āϏāĻžāĻĨā§ āĻĒāĻžāĻ āĻžāύ⧠āĻšā§ā§āĻā§āĨ¤ ping() āĻĢāĻžāĻāĻļāύ āĻĨā§āĻā§ āĻĒāĻžāĻ āĻžāύ⧠āĻā§āϝāĻžāϞ⧠main() āĻĢāĻžāĻāĻļāύ āϰāĻŋāϏāĻŋāĻ āĻāϰā§āĻā§ āĨ¤Â
[ āύā§āĻ – buffered āĻā§āϝāĻžāύā§āϞ āĻĒā§āϝāĻžāύāĻŋāĻ āĻāĻŦāĻ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠āϝāĻāύ āϰāĻŋāϏāĻŋāĻāĻžāϰ(<- link Channel ) āĻāĻŽā§āĻĒāĻāĻŋ āĻĨāĻžāĻā§ ]Â
[ā§Ē.⧍.ā§Ŧ] āĻā§āϝāĻžāύā§āϞ āĻ SelectÂ
Go-āϤā§, āϏāĻŋāϞā§āĻā§āĻ āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻ āύā§āĻ āĻā§āώā§āϤā§āϰā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§, āĻŦāĻŋāĻļā§āώ āĻāϰ⧠āĻŽāĻžāϞā§āĻāĻŋāĻĒāϞ āĻā§-āϰā§āĻāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϞ⧠āϤāĻāύ āĻ āύā§āĻ āĻĄāĻžāĻāĻž āĻļā§ā§āĻžāϰ āĻšā§, āϤāĻāύ āĻāĻā§āϞ⧠āϏāĻŋāĻā§ā§ā§āύā§āϏ āĻ āύā§āϏāĻžāϰ⧠āĻĒāĻžāĻā§āĻžāϰ āĻāύā§āϝ āϏāĻŋāϞā§āĻā§āĻ āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§āĨ¤ āĻā§āϝāĻžāύā§āϞ⧠āĻŽāĻžāϞā§āĻāĻŋāĻĒāϞ āĻĄāĻžāĻāĻž āϏāĻŋāĻā§ā§ā§āύā§āϏ āĻ āύā§āϏā§āĻŦāĻžāϰ⧠āĻĒāĻžāĻā§āĻžāϰ āĻāύā§āϝāĻ āĻāĻŽāϰāĻž āϏāĻŋāϞā§āĻā§āĻ āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āϏāĻŋāϞā§āĻā§āĻ āϏā§āĻā§āĻāĻŽā§āύā§āĻ āĻ āύā§āĻāĻāĻžāĻ switch āϏā§āĻā§āĻāĻŽā§āύā§āĻā§āϰ āĻŽāϤā§āĻ āϝāĻžāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻŽāĻžāϞā§āĻāĻŋāĻĒāϞ āĻā§āϝāĻžāύā§āϞ āĻāϰ āϏāĻžāĻĨā§ āĻāĻŽāĻŋāĻāύāĻŋāĻā§āĻļāύ āĻāϰāĻž āϝāĻžā§āĨ¤
āϏāĻŋāϞā§āĻā§āĻ āϏā§āĻā§āĻāĻŽā§āύā§āĻā§āϰ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ :Â
select {
case <-ch1: // Discard received value
fmt.Println("Got something")
case x := <-ch2: // Assign received value to x
fmt.Println(x)
case ch3 <- y: // Send y to channel
fmt.Println(y)
default:
fmt.Println("None of the above")
}
āĻāĻĒāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻā§āϝāĻžāύā§āϞ ch1 āϝāĻĻāĻŋ āϰāĻŋāϏāĻŋāĻ āϏā§āĻāĻžāĻā§ āĻĨāĻžāĻā§ āϤāĻžāĻšāϞ⧠āϏ⧠âGot somethingâ āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāĻŦā§,
āĻā§āϝāĻžāύā§āϞ ch2 āĻā§āϝāĻžāϞ⧠āϰāĻŋāϏāĻŋāĻ āĻāϰ⧠x āĻ ā§āϝāĻžāϏāĻžāĻāύ āĻāϰ⧠āϤāĻžāϰāĻĒāϰ āĻĒā§āϰāĻŋāύā§āĻ āĻāϰāĻŦā§, āĻā§āϝāĻžāύā§āϞ ch3, y āĻāϰ āĻā§āϝāĻžāϞā§Â āϏā§āύā§āĻĄ āĻāϰāĻŦā§ āĻāϰ āĻāĻ āĻāύā§āĻĄāĻŋāĻļāĻā§āϞ⧠āϏāϤā§āϝ āύāĻž āĻšāϞ⧠default āĻ âNone of the aboveâ āĻĒā§āϰāĻŋāύā§āĻ āĻšāĻŦā§āĨ¤
[ā§Ē.⧍.ā§] āĻā§āϞā§āĻāĻŋāĻ āĻā§āϝāĻžāύā§āϞ(Closing Channel )
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϝā§āĻāĻžāύ⧠āϝ⧠āĻā§āϝāĻžāύā§āϞ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšā§, āϏ⧠āĻāĻžā§āĻāĻž āĻšāϤā§āĻ āĻā§āϝāĻžāύā§āϞāĻāĻŋ āĻŦāύā§āϧ āĻāϰāĻž āϏāĻŽā§āĻāĻŦ, close() āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āĻā§āϝāĻžāύā§āϞāĻāĻŋ āĻŦāύā§āϧ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻā§āϝāĻžāύā§āϞ āĻĨā§āĻā§ āĻĄāĻžāĻāĻž āĻā§āϰāĻšāĻŖ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϰāĻŋāϏāĻŋāĻāĻžāϰ āĻāĻāĻāĻŋ āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āĻāĻžāϰāĻŋā§āĻžāĻŦāϞ āĻā§āĻāĻžāϰ āĻšāĻŋāϏā§āĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝā§āĻŽāύ –Â
v, ok := <- ch
āϝāĻĻāĻŋ ok āϏā§āĻā§āĻāĻŽā§āύā§āĻ true āĻšā§ āϤāĻžāĻšāϞ⧠āϰāĻŋāϏāĻŋāĻāĻžāϰ āĻŦā§āĻāĻŦā§ āĻāĻāĻž āϏāĻ āĻŋāĻ āϏā§āύā§āĻĄāĻžāϰ āĻĨā§āĻā§ āĻĄāĻžāĻāĻž āĻāϏā§āĻā§ āĻāϰ ok āϏā§āĻā§āĻāĻŽā§āύā§āĻ false āĻšāϞ⧠āϰāĻŋāϏāĻŋāĻāĻžāϰ āĻŦā§āĻāĻŦā§ āĻāĻāĻž āĻā§āϝāĻžāύā§āϞ āĻŦāύā§āϧ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāϰ āĻāĻāĻāĻž āĻŦāύā§āϧ āĻā§āϝāĻžāύā§āϞ āĻĨā§āĻā§ āϏāϰā§āĻŦāĻĻāĻžāĻ 0 āĻ āĻĨāĻŦāĻž nil āĻŽāĻžāύ āĻāϏāĻŦā§āĨ¤
Â
āύāĻŋāĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻĻā§āĻāĻž āϝāĻžāĻ –
package main
import (
"fmt"
)
func producer(chnl chan int) {
for i := 0; i < 10; i++ {
chnl <- i
}
close(chnl)
}
func main() {
ch := make(chan int)
go producer(ch)
for {
v, ok := <-ch
if ok == false {
break
}
fmt.Println("Received ", v, ok)
}
}
// Output:
// Received 0 true
// Received 1 true
// Received 2 true
// Received 3 true
// Received 4 true
// Received 5 true
// Received 6 true
// Received 7 true
// Received 8 true
// Received 9 true
āĻāĻāĻžāύ⧠0 āĻĨā§āĻā§ 9 āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāĻŋāύā§āĻ āĻšā§ā§āĻā§, āϝāĻāύ ok āĻā§āϝāĻžāϞ⧠āĻŽāĻŋāĻĨā§āϝāĻž āĻĒā§ā§ā§āĻā§ āϤāĻāύāĻ āĻā§āϝāĻžāύā§āϞ āĻŦāύā§āϧ āĻāϰ⧠āĻĻāĻŋā§ā§āĻā§āĨ¤ main() āĻĢāĻžāĻāĻļāύ⧠ok āĻŽāĻŋāĻĨā§āϝāĻž āĻšāĻā§āĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§āĻ break āĻāϰ⧠āĻĻāĻŋā§ā§āĻā§āĨ¤Â