Go 在接收器读取通道块之前,是否关闭通道块

Go 在接收器读取通道块之前,是否关闭通道块,go,concurrency,channel,goroutine,Go,Concurrency,Channel,Goroutine,我已经实现了一种通过关闭通道关闭服务器的方法,因此其他goroutine读取关闭的通道,然后退出。关机后,我需要对服务器数据进行一些清理,如果关闭块直到所有其他goroutine读取关闭的通道,我就可以无锁地访问数据。所以问题是:关闭一个通道是否会阻塞,直到接收器读取它?下面是示例代码: package main type server struct { chStop chan struct{} data map[int]interface{} } func newServe

我已经实现了一种通过关闭通道关闭服务器的方法,因此其他goroutine读取关闭的通道,然后退出。关机后,我需要对服务器数据进行一些清理,如果关闭块直到所有其他goroutine读取关闭的通道,我就可以无锁地访问数据。所以问题是:关闭一个通道是否会阻塞,直到接收器读取它?下面是示例代码:

package main

type server struct {
    chStop chan struct{}
    data map[int]interface{}
}

func newServer() *server {
    return &server {
        chStop: make(chan struct{})
    }
}

func (s *server) stop() {
    close(s.chStop)
    // do something with s.data
    ...
    // if other goroutines already read closed s.chStop and exited,
    // we can access s.data without lock
}

func (s *server) run2() {
    ...
    for {
        select{
        case <-s.chStop:
            return
        case <- other channel:
        // access s.data with lock
        }
    }
}

func (s *server) run() {
    ch := make(chan struct{})
    ...
    for {
        select{
        case <-s.chStop:
            return
        case <- ch:
            // access s.data with lock
        }
    }
}

func main() {
    s := newServer()
    go s.run()
    go s.run2()
    s.stop()
}

否。请改用a。

否。请改用a。

有关于关闭行为的文档吗?我还没有在golang spec上找到。谢谢你们提供的信息:有关于close行为的文档吗?我还没有在golang spec上找到。谢谢你们提供的信息: