运行了三个协程,但是结果竟然是一样的为什么

jinjiashan · 2017-06-17 03:57:51 · 2203 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-06-17 03:57:51 的主题,其中的信息可能已经有所发展或是发生改变。

package main
import(
    "fmt"
    "time"
)

//class Thread
type  Thread struct{
    name string
}
func  (this *Thread)run()string{
    fmt.Println(this.name, "start")

    return ""
}

//class Threads
type Threads struct{
    t map[string]Thread
}

func (this *Threads)runn()string{
    for key, v:=range this.t{
        fmt.Println("Key:",key, "Value:", v.name)
        go v.run()    //这个地方输出的不是我预期的, why

    }
    return ""
}


func main(){
    fmt.Println("main start")

    var tt Threads = Threads{}
    tt.t = make(map[string]Thread)
    tt.t["one"] = Thread{name:"one1"}
    tt.t["two"] = Thread{name:"two2"}
    tt.t["three"] = Thread{name:"three3"}
    tt.runn()  //why

    time.Sleep(5*1e9)
    fmt.Println("main end")
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2203 次点击  
加入收藏 微博
12 回复  |  直到 2017-06-17 05:39:05
jinjiashan
jinjiashan · #1 · 8年之前

我的理解是用go 来运行协程,go + 对象成员函数,会根据对象不同而输出不同的数据.不知道为什么会一样

channel
channel · #2 · 8年之前
type Threads struct{
    t map[string]Thread
}

改为

type Threads struct{
    t map[string]*Thread
}
jinjiashan
jinjiashan · #3 · 8年之前
channelchannel #2 回复

``` type Threads struct{ t map[string]Thread } ``` 改为 ``` type Threads struct{ t map[string]*Thread } ```

没有看出区别

channel
channel · #4 · 8年之前

再或者这么改:

运行的地方改为:

go func(v Thread) {
    v.run()
}(v)
jinjiashan
jinjiashan · #5 · 8年之前
channelchannel #2 回复

``` type Threads struct{ t map[string]Thread } ``` 改为 ``` type Threads struct{ t map[string]*Thread } ```

哦,这种方式是可以的,但是不理解原因

jinjiashan
jinjiashan · #6 · 8年之前
type Threads struct{
    t map[string]*Thread
}

这种方式可以的,但是为什么,我不知道,麻烦帮忙解释一下吗@channel

channel
channel · #7 · 8年之前

还有一种修改方法,就是 run 方法的定义,改为 func (self Thread) run() string{}。这三种修改方法都行,你应该可以明白为什么了。

jinjiashan
jinjiashan · #8 · 8年之前
channelchannel #7 回复

还有一种修改方法,就是 run 方法的定义,改为 `func (self Thread) run() string{}`。这三种修改方法都行,你应该可以明白为什么了。

那我现在有个问题,我想实现实现run函数的内容,难道需要分别针对指针和对象实现两个不同的函数吗

jinjiashan
jinjiashan · #9 · 8年之前

func (self Thread) run() string{} 我一直理解的是self 是不用关注外部使用的是对象还是指针的.

jinjiashan
jinjiashan · #10 · 8年之前
channelchannel #7 回复

还有一种修改方法,就是 run 方法的定义,改为 `func (self Thread) run() string{}`。这三种修改方法都行,你应该可以明白为什么了。

另外还有,如果我不使用协程的方式调用run的时候,结果是对了呀

channel
channel · #11 · 8年之前

关键原因:对象到指针,Go 会做自动取对象的指针,而在使用 go 关键词时,这个自动转换过程还没有开始,三次循环下来,v 成了最后一次循环的值,转换指针都用的最后一个的。

jinjiashan
jinjiashan · #12 · 8年之前

非常谢谢,看来我需要去了解一下协程的大概原理.

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传