gpt4 book ai didi

loops - 为什么可以通过赋值来更改 slice ,而不能通过for循环来更改?

转载 作者:行者123 更新时间:2023-12-01 22:40:38 24 4
gpt4 key购买 nike

我需要在接收 slice 指针的函数中将每个分数更改为其他一些值,我可以通过赋值来更改值,但是如果在for循环中执行此操作则不会更改任何值。这是为什么?

package main

import (
"fmt"
"sync"
"time"
)

type TestType struct {
id int
score float64
}

func worker(index int, wg *sync.WaitGroup, listScores *[][]TestType) {
defer wg.Done()
time.Sleep(1000 * time.Millisecond)

// It works by assigning.
(*listScores)[index] = []TestType{{index + 1, 2.22},
{index + 1, 2.22},
{index + 1, 2.22},}
// It doesn't work in a for loop.
//for _, score := range (*listScores)[index] {
// score.score = 2.22
//}
}

func main() {
scoresList := [][]TestType{
{{1, 0.0},
{1, 0.0},
{1, 0.0},},
{{2, 0.0},
{2, 0.0},
{2, 0.0},
},}

fmt.Println(scoresList)

var wg sync.WaitGroup
for i, _ := range scoresList {
wg.Add(1)
go worker(i, &wg, &scoresList)
}
wg.Wait()

fmt.Println(scoresList)
}

通过为它分配一个新的整体 slice ,可以将分数更改为2.22:
[[{1 0} {1 0} {1 0}] [{2 0} {2 0} {2 0}]]
[[{1 2.22} {1 2.22} {1 2.22}] [{2 2.22} {2 2.22} {2 2.22}]]

但是,如果我在注释中的for循环中执行此操作,则输出如下所示:
[[{1 0} {1 0} {1 0}] [{2 0} {2 0} {2 0}]]
[[{1 0} {1 0} {1 0}] [{2 0} {2 0} {2 0}]]

最佳答案

因为range提供了两个元素:

  • 索引
  • 如果迭代 slice ,则将复制到元素的。

  • 无需使用线程即可将代码更改为以下代码:

    package main

    import (
    "fmt"
    )

    type testType struct {
    id int
    score float64
    }

    func main() {
    scoresList := [][]testType{
    {{1, 0.0}, {1, 0.0}, {1, 0.0}},
    {{2, 0.0}, {2, 0.0}, {2, 0.0}}}
    fmt.Println(scoresList)
    for i := range scoresList {
    scoresList[i] = []testType{{i + 1, 2.22},
    {i + 1, 2.22},
    {i + 1, 2.22}}
    }
    fmt.Println(scoresList)
    }

    如果要使用线程,则可以使用以下线程:

    package main

    import (
    "fmt"
    "sync"
    "time"
    )

    type TestType struct {
    id int
    score float64
    }

    func worker(index int, wg *sync.WaitGroup, listScores *[][]TestType) {
    defer wg.Done()
    time.Sleep(1000 * time.Millisecond)

    for i := range (*listScores)[index] {
    (*listScores)[index][i].score = 2.22
    }
    }

    func main() {
    scoresList := [][]TestType{
    {{1, 0.0},
    {1, 0.0},
    {1, 0.0}},
    {{2, 0.0},
    {2, 0.0},
    {2, 0.0},
    }}

    fmt.Println(scoresList)

    var wg sync.WaitGroup
    for i, _ := range scoresList {
    wg.Add(1)
    go worker(i, &wg, &scoresList)
    }
    wg.Wait()

    fmt.Println(scoresList)
    }

    关于loops - 为什么可以通过赋值来更改 slice ,而不能通过for循环来更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60354431/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com