package main
import (
"fmt"
"time"
)
// 使用channel一样要遵守一些约定。
// 一个约定就是将内存的所有权交出去后,无论是通过内存指针,还是消息控制,就不能再操作这块内存。否则一样会引入多线程问题
func main() {
output := make(chan []int)
stop := make(chan struct{})
go func() {
arr := []int{1, 2, 3}
output <- arr
time.Sleep(time.Second * 2)
arr[1] = 5 // 2秒后赋值为 5
stop <- struct{}{}
}()
outArr := <-output // 立即执行输出,如果没有延迟,应是输出原始值
fmt.Printf("%v\n", outArr)
outArr[1] = 10 // 立即输出赋值为10的操作
fmt.Printf("%v\n", outArr)
//对于主线程而言,将outArr[1]设置为10后,两次读的结果不同,数据被破坏。
time.Sleep(time.Second * 2) // 2秒后再执行这个输出。
fmt.Printf("%v\n", outArr)
<-stop
}
输出:
[1 2 3]
[1 10 3]
[1 10 3]