Go协程的小发现

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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值