github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/coding/runtime/03-chan.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 type user struct { 9 name string 10 age int8 11 } 12 13 var u = user{name: "Ankur", age: 20} 14 var g = &u 15 16 func modifyUser(pu *user) { 17 fmt.Println("modifyUser Received Value", pu) 18 pu.name = "Anand" 19 } 20 21 func printUser(u <-chan *user) { 22 time.Sleep(2 * time.Second) 23 fmt.Println("printUser goroutine called", <-u) 24 } 25 26 func main() { 27 c := make(chan *user, 5) 28 c <- g // 值拷贝 29 fmt.Println(g) 30 // modify g 31 g = &user{name: "Ankur Anand", age: 100} 32 go printUser(c) // 打印 channel 发现 里数据是 g 指向 的 &u 的拷贝, 并不是g的地址 33 go modifyUser(g) 34 time.Sleep(5 * time.Second) 35 fmt.Println(g) 36 } 37 38 /* 39 &{Ankur 20} 40 modifyUser Received Value &{Ankur Anand 100} 41 printUser goroutine called &{Ankur 20} 42 &{Anand 100} 43 */