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  */