doujiao1984 2017-07-01 21:47
浏览 91
已采纳

Goroutine用指针在函数循环中覆盖了值?

I have just started playing with Go and stumbled upon problem how the pointers are handled in this language.

I have such code and can`t figure out how to fix it to get the correct response.

Changing func (me *Str) Start() to func (me Str) Start() fixes the problem, but I need this as reference to write this structure (it will have channel in it).

Sample code (https://play.golang.org/p/EsPejyCrX7):

package main

import (
    "fmt"
    "sync"
)

var wg1 sync.WaitGroup

type Str struct {
    id int
}

func (me *Str) Start() {
    wg1.Add(1)
    fmt.Println("F1 ", me)
    go me.startFn()
}

func (me *Str) startFn() {
    defer wg1.Done()
    fmt.Println("F2 ", me)
}

func main() {
    Fl2 := []Str{
        {1},
        {2},
        {3},
    }

    for _, fl := range Fl2 {
        fl.Start()
    }
    wg1.Wait()
}

Response:

F1  &{1}
F1  &{2}
F1  &{3}
F2  &{3}
F2  &{3}
F2  &{3}

Expected response (F2 can be random):

F1  &{1}
F1  &{2}
F1  &{3}
F2  &{3}
F2  &{2}
F2  &{1}
  • 写回答

1条回答 默认 最新

  • duancao1951 2017-07-01 21:54
    关注

    Using goroutines on loop iterator variables is a common mistake.

    Call .Start on the element of Fl2 by the range index, instead of the range value (playground):

    for i := range Fl2 {
        Fl2[i].Start()
    }
    

    However, the output might still not become exactly as you expect, due to the scheduling of the goroutines, for example it might be like this:

    F1  &{1}
    F1  &{2}
    F1  &{3}
    F2  &{3}
    F2  &{1}
    F2  &{2}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了