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

message
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)
}
  1. 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
  1. 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
  1. 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