Closing a channel tells a range loop when no more values are coming.

Close and Range

close_range.go
package main

import "fmt"

func main() {
	var extra = 
	stream := make(chan string, 3)

	stream <- "alpha"
	stream <- "beta"
	stream <- extra
	close(stream)

	count := 0
	for item := range stream {
		count++
		fmt.Println("item=", item)
	}
	fmt.Println("count=", count)
}
package main

import "fmt"

func main() {
	var extra = 
	stream := make(chan string, 3)

	stream <- "alpha"
	stream <- "beta"
	stream <- extra
	close(stream)

	count := 0
	for item := range stream {
		count++
		fmt.Println("item=", item)
	}
	fmt.Println("count=", count)
}
package main

import "fmt"

func main() {
	var extra = 
	stream := make(chan string, 3)

	stream <- "alpha"
	stream <- "beta"
	stream <- extra
	close(stream)

	count := 0
	for item := range stream {
		count++
		fmt.Println("item=", item)
	}
	fmt.Println("count=", count)
}
close channel A `for range` loop over a channel stops after the channel is closed and drained.