>

이 코드 :

import "fmt"
import "time"
func main() {
    string_slice:=[]string{"a","b","c"}
    for _,s:=range string_slice{
        go func(){
            time.Sleep(1*time.Second)
            fmt.Println(s)
        }()
    }
    time.Sleep(3*time.Second)
}

이 코드는 다음과 같이 출력 "c c c"를 생성합니다 :

import "fmt"
func main() {
    string_slice:=[]string{"a","b","c"}
    for _,s:=range string_slice{
        s="asd"
        fmt.Println(s)
    }
    fmt.Println(string_slice)
}

"[a b c]"출력을 생성합니다

첫 번째는 범위에 대해 참조를 반복하지 말아야하며 (그렇지 않아야 함) 두 번째는 값을 반복하여 반복해야 함을 제안합니다.

첫 번째 출력이 "a b c"출력을 생성하지 않는 이유는 무엇입니까?


  • 답변 # 1

    고 루틴을 사용할 때는 병렬로 실행한다고 가정해야합니다. 따라서이 경우 'c c c'가 너무 'b b b'또는 'a a a'로 나타날 수 있습니다

    이 코드의 3 번 실행 :

    for _,s:=range string_slice \\run t0, t1, t2
    
    

    이 코드를 3 번 ​​달리기 위해전송합니다 :

    go func(){
      fmt.Println(s)
    }()//send in t0, t1, t2
    
    
    예를 들어, t2에서 func ()가 실행되기 시작할 수 있습니다. 이 경우s이 최신 값 (string_slice [2])과 같기 때문에 결과는 'c c c'입니다.

    이 솔루션은 func params에 의한 복사 가치입니다 :

    for _, s := range string_slice{
        go func(x string){
            time.Sleep(1*time.Second)
            fmt.Println(x)
        }(s)
    }
    
    

    반복마다 새로운 가치 창출

    //creating new value per iteration
    for i := range string_slice{
        s := string_slice[i]
        go func(){
            time.Sleep(1*time.Second)
            fmt.Println(s)
        }()
    }
    
    

    https://play.golang.org/p/uRD6Qy6xSw 작업 참조

  • 이전 Microsoft SQL Server Management Studio에서 기존 작업의 단계와 예약 된 시간을 교환하는 방법은 무엇입니까?
  • 다음 c# - Javascript 및 ASPNET을 사용하여 ASP 텍스트 상자의 유효성 검사가 작동하지 않습니다