旋量群是由表达式或其有关提及自然环境组合成的虚拟,通常透过在非官方表达式中提及外部表达式的局部表达式或包表达式逐步形成。
旋量群=非官方表达式+提及自然环境(外部表达式的局部表达式或是全局表达式)
旋量群对旋量群外的自然环境导入是间接提及,C++检测到旋量群,会将旋量群提及的外部表达式重新分配到堆上。
旋量群提及全局表达式并非好的程式设计形式。
旋量群时常被用作包装袋表达式,事先表述好两个或数个模块用作包装袋,另一类常用的应用领域是采用旋量群来顺利完成更为简约的严重错误检查和。
假如表达式返回的旋量群提及了该表达式的局部表达式(模块或表达式外部表达式):
1、数次初始化该表达式,回到的数个旋量群所提及的外部表达式是数个复本,其原因是每天初始化表达式单厢为局部表达式初始化。
2、用两个旋量群表达式数次,假如该旋量群修正了其提及的外部表达式,则每天初始化该旋量群对该外部表达式都有负面影响,即使旋量群表达式共享资源外部应用领域。
package main import “fmt” func calc(a int) func(i int) int { // var a int =1 // 也能在这儿新闻稿表达式 return func(i int) int { // 回到的是两个非官方表达式,但那个非官方表达式提及到表达式外的a,因而那个非官方表达式和a就逐步形成了两个总体,逐步形成旋量群。fmt.Printf(“外部表达式a的门牌号:%p,a的值为:%d,入参i的门牌号为:%p, 入参i的值为:%d\n”, &a, a, &i, i) a = a + i returna } }func main() { f := calc(1) // 表达式对象f和外部表达式a是两个总体,是两个旋量群 g := calc(1) fmt.Println(f(1)) // 修正了表达式afmt.Println(f(1)) fmt.Println(f(1)) fmt.Println(g(1)) fmt.Println(g(1)) }同两个表达式回到的数个旋量群共享资源该表达式的局部表达式
package main import “fmt” func calc(a int) (func(i int) int, func(i int) int) { add := func(i int) int { fmt.Printf(“外部表达式a的门牌号:%p,a的值为:%d,入参i的门牌号为:%p, 入参i的值为:%d\n”, &a, a, &i, i) a = a + i return a } sub := func(i int) int { a = a – i return a } return add, sub } func main(){ f, g := calc(1) // 表达式对象f,g 和入参1组成旋量群,是两个总体 m, n := calc(1) // 初始a=1,f(1)=2,此时a=2,由于f,g,a=2是两个总体,所以,g(2)=0fmt.Println(f(1), g(2)) fmt.Println(m(4), n(6)) }即,两个回到的非官方表达式和外部表达式a,组成两个总体,是两个旋量群
Goroutine与旋量群
package main import ( “fmt” “sync” “time” ) var a = […]int{1, 2, 3, 4, 5, 6, 7, 8, 9} func Run() { fmt.Println(“Begin”, time.Now()) var wg sync.WaitGroup wg.Add(len(a)) for _, i := range a { go func(n int) { // 表达式表达式是以值的形式传递的fmt.Printf(“get value: %d \n”, n) time.Sleep(time.Second) wg.Done() }(i) /* go func(){ // 由于for循环非常快,而启动Goroutine是两个费时操作, // 所以Goroutine还没开始执行,for循环已经执行完毕,此时i=5 // 由于i是所有Goroutine非官方表达式的外部表达式,所以所有的Goroutine只会打印5 fmt.Printf(“get value: %d \n”, i) time.Sleep(time.Second) wg.Done() }() */ } wg.Wait() fmt.Println(“End”, time.Now()) } func main() { Run() }