Challenge 1 — Solution Task: Write a function cube(n int, results chan int) that sends n³ into results. In main, create an unbuffered channel, launch cube(4, results) as a goroutine, receive the value, and print it. package main import "fmt" func cube(n int, results chan int) { results <- n * n * n } func main() { results := make(chan int) go cube(4, results) value := <-results fmt.Println(value) } Expected output: 64 Notes: - results := make(chan int) creates an UNBUFFERED channel — sending into it blocks until something is ready to receive, and vice versa. - value := <-results blocks main() until cube's goroutine actually sends a value, which is exactly why no time.Sleep workaround is needed here — the channel itself provides the synchronization. - cube runs as a separate goroutine, but because main immediately tries to receive from results, the two effectively hand off the value to each other the moment it's ready.