49 lines
1.4 KiB
Plaintext
49 lines
1.4 KiB
Plaintext
|
|
package routineCtrlUtil
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"testing"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func TestRoutineCtrl(t *testing.T) {
|
|||
|
|
rtCtrl := New(3)
|
|||
|
|
|
|||
|
|
for i := 0; i < 10; i++ {
|
|||
|
|
// 闭包函数避坑注意!!!
|
|||
|
|
// 本段代码有坑,请特别注意!!!
|
|||
|
|
// *** 待执行函数引用外变变量i,程序可能会出现不符合逻辑的结果(外部变量变化时,闭包函数获取到的是变化后的变量值) ***
|
|||
|
|
//rtCtrl.Run(func(arg interface{}) {
|
|||
|
|
// fmt.Println(".", i)
|
|||
|
|
// time.Sleep(time.Second * 1)
|
|||
|
|
// fmt.Println("*", i)
|
|||
|
|
// panic("111")
|
|||
|
|
//}, nil)
|
|||
|
|
|
|||
|
|
//-------------------------------------------------
|
|||
|
|
// 以下两种方式为正确示例:
|
|||
|
|
|
|||
|
|
// 避坑方式一:将闭包内使用的外部变量作为参数传入
|
|||
|
|
// 将待执行函数内使用的外部变量,用参数传入,可避免不符合逻辑的结果
|
|||
|
|
//rtCtrl.Run(func(arg interface{}) {
|
|||
|
|
// ii, _ := arg.(int)
|
|||
|
|
// fmt.Println(".", ii)
|
|||
|
|
// time.Sleep(time.Second * 1)
|
|||
|
|
// fmt.Println("*", ii)
|
|||
|
|
// panic("111")
|
|||
|
|
//}, i)
|
|||
|
|
|
|||
|
|
// 避坑方式二:将闭包内使用的外部变量固定下来,不让其再被修改
|
|||
|
|
temp := i // 这种方式将产生一个局变变量temp,并且temp不会被修改
|
|||
|
|
rtCtrl.Run(func(arg interface{}) {
|
|||
|
|
fmt.Println(".", temp)
|
|||
|
|
time.Sleep(time.Second * 1)
|
|||
|
|
fmt.Println("*", temp)
|
|||
|
|
panic("111")
|
|||
|
|
}, nil)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rtCtrl.Wait()
|
|||
|
|
fmt.Println("\n==============")
|
|||
|
|
}
|