Since Goroutine is executed in parallel, data cannot be exchanged normally. However, you can exchange data by using channel.
It's like connecting a tunnel!
package main
import (
"fmt"
)
func goroutine1(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
//Send data to channel
c <- sum
}
func main() {
s := []int{1, 2, 3, 4}
c := make(chan int)
go goroutine1(s, c)
//Receive the sent data
p := <-c
fmt.Println(p) // => 10
}
The value is sent to c with c <-sum and received with p: = <-c. Here, it is blocked until it is received, and p is waiting until it receives sum. It's similar to sync.Wait!
Buffered channels A buffer is a memory area for temporarily storing data when processing is performed by a program. An image that stores temporary data in a channel.
package main
import "fmt"
func main() {
//Up to 2 buffers can be saved
ch := make(chan int, 2)
ch <- 100
//len()You can check the length of the channel with
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
//I get an error when I try to send the third data
ch <- 300
fmt.Println(len(ch)) // => fatal error: all goroutines are asleep - deadlock!
}
Execution result
1
2
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/tmp/sandbox795806942/prog.go:11 +0x16f
You can only save up to two, so trying to send the third will, of course, result in an error. (Deadlock)
If you take out one channel in front and send 300 as shown in ↓, no error will occur.
func main() {
ch := make(chan int, 2)
ch <- 100
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
x := <-ch
fmt.Println(x)
ch <- 300
fmt.Println(len(ch))
}
Execution result
1
2
100
2
Then look at the code below ↓
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 100
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
for c := range ch {
fmt.Println(c)
}
}
This is trying to loop the channel in range, but this is an error.
Execution result
1
2
100
200
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/tmp/sandbox892357489/prog.go:12 +0x1f3
This is because it tries to loop to a third channel that doesn't exist. To stop looping on the second channel, you need to close the channel once. For that, it is necessary to describe close (ch).
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 100
fmt.Println(len(ch))
ch <- 200
fmt.Println(len(ch))
close(ch)
for c := range ch {
fmt.Println(c)
}
}
Execution result
1
2
100
200
If you have any suggestions, I would appreciate it if you could comment! !!
Recommended Posts