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 来运行协程,go + 对象成员函数,会根据对象不同而输出不同的数据.不知道为什么会一样
改为
没有看出区别
再或者这么改:
运行的地方改为:
哦,这种方式是可以的,但是不理解原因
这种方式可以的,但是为什么,我不知道,麻烦帮忙解释一下吗@channel
还有一种修改方法,就是 run 方法的定义,改为
func (self Thread) run() string{}
。这三种修改方法都行,你应该可以明白为什么了。那我现在有个问题,我想实现实现run函数的内容,难道需要分别针对指针和对象实现两个不同的函数吗
func (self Thread) run() string{} 我一直理解的是self 是不用关注外部使用的是对象还是指针的.
另外还有,如果我不使用协程的方式调用run的时候,结果是对了呀
关键原因:对象到指针,Go 会做自动取对象的指针,而在使用 go 关键词时,这个自动转换过程还没有开始,三次循环下来,v 成了最后一次循环的值,转换指针都用的最后一个的。
非常谢谢,看来我需要去了解一下协程的大概原理.