你需要缓冲你的频道。缓冲通道在阻塞之前可以存储这么多元素。 chanA := make(chan string, 1)chanA <- "el" // This will not blockfmt.Println("Hello World") 在上面的缓冲通道上执行chanA <- "el"操作时,元素会被放入缓冲区,thread不会阻塞。如果添加第二个元素,它将阻塞,因为缓冲区中没有空间: chanA := make(chan string, 1)chanA <- "el"chanA <- "el" // <- This will block, as the buffer is full 在您的示例中,缓冲区为0。因此,对通道的第一次写入被阻止,并且需要另一个thread来读取要取消阻止的值。 https://go.dev/play/p/6GbsVW4d0Mg chanA := make(chan string) go func() { time.Sleep(time.Second) fmt.Println("Pop:", <-chanA) // Unblock the writer }() chanA <- "el" Extra knowledge 如果不希望thread阻塞,可以在select中包装通道插入。这将确保如果通道已满,应用