Channels and Select
Send and Receive
A channel send places a value, and a receive takes that value back out.
channel send
The `<-` operator sends into a channel on one side and receives from it on the other.
Send and Receive
send_receive.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
func main() {
var message = "ready"
updates := make(chan string, 1)
updates <- message
received := <-updates
fmt.Println("sent=", message)
fmt.Println("received=", received)
fmt.Println("empty=", len(updates) == 0)
}
package main
import "fmt"
func main() {
var message = "sent"
updates := make(chan string, 1)
updates <- message
received := <-updates
fmt.Println("sent=", message)
fmt.Println("received=", received)
fmt.Println("empty=", len(updates) == 0)
}
package main
import "fmt"
func main() {
var message = "done"
updates := make(chan string, 1)
updates <- message
received := <-updates
fmt.Println("sent=", message)
fmt.Println("received=", received)
fmt.Println("empty=", len(updates) == 0)
}
message ← "ready", updates ← (chan string)(⟨addr A⟩), received ← "ready"
5func main() {6 var message→ "ready" = "ready" //@message="sent", "done"7 updates→ (chan string)(⟨addr A⟩) := make(chan string, 1)89 updates(chan string)(⟨addr A⟩) <- message"ready"10 received→ "ready" := <-updates(chan string)(⟨addr A⟩)1112 fmt.Println("sent=", message"ready")13 fmt.Println("received=", received"ready")14 fmt.Println("empty=", len(updates(chan string)(⟨addr A⟩)) == 0)15}outputsent= ready received= ready empty= true
message ← "sent", updates ← (chan string)(⟨addr A⟩), received ← "sent"
5func main() {6 var message→ "sent" = "sent"7 updates→ (chan string)(⟨addr A⟩) := make(chan string, 1)89 updates(chan string)(⟨addr A⟩) <- message"sent"10 received→ "sent" := <-updates(chan string)(⟨addr A⟩)1112 fmt.Println("sent=", message"sent")13 fmt.Println("received=", received"sent")14 fmt.Println("empty=", len(updates(chan string)(⟨addr A⟩)) == 0)15}outputsent= sent received= sent empty= true
message ← "done", updates ← (chan string)(⟨addr A⟩), received ← "done"
5func main() {6 var message→ "done" = "done"7 updates→ (chan string)(⟨addr A⟩) := make(chan string, 1)89 updates(chan string)(⟨addr A⟩) <- message"done"10 received→ "done" := <-updates(chan string)(⟨addr A⟩)1112 fmt.Println("sent=", message"done")13 fmt.Println("received=", received"done")14 fmt.Println("empty=", len(updates(chan string)(⟨addr A⟩)) == 0)15}outputsent= done received= done empty= true