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