Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 我应该在阻塞来自通道的select循环时将请求对象传递给GOROUTE吗?_Loops_Go_Goroutine - Fatal编程技术网

Loops 我应该在阻塞来自通道的select循环时将请求对象传递给GOROUTE吗?

Loops 我应该在阻塞来自通道的select循环时将请求对象传递给GOROUTE吗?,loops,go,goroutine,Loops,Go,Goroutine,对于代码中的select结构,我有以下内容: go func(runCh chan Caller, shutdownSignal chan bool) { for { select { case request := <-runCh: go func() { w.Run(&request) }()

对于代码中的select结构,我有以下内容:

go func(runCh chan Caller, shutdownSignal chan bool) {
        for {
            select {
            case request := <-runCh:
                go func() {
                    w.Run(&request)
                }()
            case <-shutdownSignal:
                w.Shutdown()
                return
            }
        }
    }(runCh, shutdownCh)
go func(runCh chan Caller,shutdownSignal chan bool){
为了{
挑选{
案例请求:=否(不适用于此处),在每个循环迭代中都有新变量(内存地址):

 case request := <-runCh:
输出(每个循环迭代中请求的地址不同):

请参阅:0xc0000b8000!=0xc0000b8008

否(不适用于此处),在每个循环迭代中都有新变量(内存地址):

 case request := <-runCh:
输出(每个循环迭代中请求的地址不同):


请参阅:0xc0000b8000!=0xc0000b8008

这是准确的,但有点误导性-
:=
并不是它与使用
循环变量的问题的区别,即使这些变量是使用
:=
创建的。对于这里的每个goroutine调用,它都将是一个且只有一个新的
请求
变量。如果您更改e
:=
到simple
request=实际上,如果您将其更改为
request=当然是
request=这是准确的,但有点误导-
:=
并不是它与使用
循环变量的问题的区别,即使这些变量是使用
:=
创建的t将是这里唯一一个新的
请求
变量。如果您将
更改为simple
request=实际上如果您将它更改为
request=当然是
请求=
package main

import (
    "fmt"
    "time"
)

func main() {
    runCh := make(chan int, 2)
    runCh <- 1
    runCh <- 2
    for i := 1; i <= 2; i++ {
        select {
        case request := <-runCh:
            go func() {
                fmt.Println(request, &request)
                time.Sleep(200 * time.Millisecond)
                fmt.Println(request, &request)

            }()
        }
    }
    time.Sleep(500 * time.Millisecond)

}
1 0xc0000b8000
2 0xc0000b8008
1 0xc0000b8000
2 0xc0000b8008