为了账号安全,请及时绑定邮箱和手机立即绑定

为什么切片可以通过分配在函数中更改,而不是在 for 循环中?

为什么切片可以通过分配在函数中更改,而不是在 for 循环中?

Go
长风秋雁 2022-05-18 14:21:11
我需要在接收切片指针的函数中将每个分数更改为其他一些值,我可以通过分配来更改值,但如果我在 for 循环中执行此操作,则不会发生任何变化。这是为什么?package mainimport (    "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)}通过为其分配一个新的整个切片,可以将分数更改为 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}]]
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

因为range给你两个元素:

  • 索引

  • 如果迭代切片,则为元素的副本。

不使用线程可以将代码更改为以下代码:

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)

}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信