package main
import (
"fmt"
"time"
)
type myString string
func (v *myString) myMethod() {
fmt.Println(*v)
}
// 理解为启动协程所耗时间比for循环结束时间要长,所以都是打印出不固定
// go的时候对象已经被篡改了
func bad1(values []myString) {
for _, v := range values {
go func() {
fmt.Println(v)
}()
}
}
// 理解为启动goroutine之前,val的值已经确定了
func good1(values []myString) {
for _, v := range values {
val := v
go func() {
fmt.Println(val)
}()
}
}
// 理解为print的时候,已经确定好了val的值
func good2(values []myString) {
for _, v := range values {
go func(val myString) {
fmt.Println(val)
}(v)
}
}
// 不正常 后续待研究
func badMethod(values []myString) {
for _, v := range values {
go v.myMethod()
}
}
// 正常
func goodMethod1(values []myString) {
for _, v := range values {
newVal := v
go newVal.myMethod()
}
}
// 正常,跟badMethod的区别后续待研究
func goodMethod2() {
ni := myString("ni")
hao := myString("hao")
a := myString("a")
da := myString("da")
ge := myString("ge")
values := []*myString{&ni, &hao, &a, &da, &ge}
for _, v := range values {
go v.myMethod()
}
}
func main() {
//values := []myString{"ni", "hao", "a", "da", "ge"}
//bad1(values)
//good1(values)
//good2(values)
//badMethod(values)
//goodMethod1(values)
//goodMethod2()
time.Sleep(1 * time.Second)
}
Go协程的小发现
最新推荐文章于 2024-06-07 14:56:37 发布