golang channel 多协程问题示例

    技术2026-03-27  14

    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]  

     

    Processed: 0.011, SQL: 9