...
Run Format

Source file test/closure2.go

Documentation: test

  // run
  
  // Copyright 2015 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  // Check that these do not use "by value" capturing,
  // because changes are made to the value during the closure.
  
  package main
  
  func main() {
  	{
  		type X struct {
  			v int
  		}
  		var x X
  		func() {
  			x.v++
  		}()
  		if x.v != 1 {
  			panic("x.v != 1")
  		}
  
  		type Y struct {
  			X
  		}
  		var y Y
  		func() {
  			y.v = 1
  		}()
  		if y.v != 1 {
  			panic("y.v != 1")
  		}
  	}
  
  	{
  		type Z struct {
  			a [3]byte
  		}
  		var z Z
  		func() {
  			i := 0
  			for z.a[1] = 1; i < 10; i++ {
  			}
  		}()
  		if z.a[1] != 1 {
  			panic("z.a[1] != 1")
  		}
  	}
  
  	{
  		w := 0
  		tmp := 0
  		f := func() {
  			if w != 1 {
  				panic("w != 1")
  			}
  		}
  		func() {
  			tmp = w // force capture of w, but do not write to it yet
  			_ = tmp
  			func() {
  				func() {
  					w++ // write in a nested closure
  				}()
  			}()
  		}()
  		f()
  	}
  
  	{
  		var g func() int
  		for i := range [2]int{} {
  			if i == 0 {
  				g = func() int {
  					return i // test that we capture by ref here, i is mutated on every interation
  				}
  			}
  		}
  		if g() != 1 {
  			panic("g() != 1")
  		}
  	}
  
  	{
  		var g func() int
  		q := 0
  		for range [2]int{} {
  			q++
  			g = func() int {
  				return q // test that we capture by ref here
  					 // q++ must on a different decldepth than q declaration
  			}
  		}
  		if g() != 2 {
  			panic("g() != 2")
  		}
  	}
  
  	{
  		var g func() int
  		var a [2]int
  		q := 0
  		for a[func() int {
  			q++
  			return 0
  		}()] = range [2]int{} {
  			g = func() int {
  				return q // test that we capture by ref here
  					 // q++ must on a different decldepth than q declaration
  			}
  		}
  		if g() != 2 {
  			panic("g() != 2")
  		}
  	}
  }
  

View as plain text