mirror of
https://github.com/golang/go
synced 2024-11-19 21:14:43 -07:00
89 lines
1.1 KiB
Go
89 lines
1.1 KiB
Go
|
// Tests of bound method closures.
|
||
|
|
||
|
package main
|
||
|
|
||
|
func assert(b bool) {
|
||
|
if !b {
|
||
|
panic("oops")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type I int
|
||
|
|
||
|
func (i I) add(x int) int {
|
||
|
return int(i) + x
|
||
|
}
|
||
|
|
||
|
func valueReceiver() {
|
||
|
var three I = 3
|
||
|
assert(three.add(5) == 8)
|
||
|
var add3 func(int) int = three.add
|
||
|
assert(add3(5) == 8)
|
||
|
}
|
||
|
|
||
|
type S struct{ x int }
|
||
|
|
||
|
func (s *S) incr() {
|
||
|
s.x++
|
||
|
}
|
||
|
|
||
|
func (s *S) get() int {
|
||
|
return s.x
|
||
|
}
|
||
|
|
||
|
func pointerReceiver() {
|
||
|
ps := new(S)
|
||
|
incr := ps.incr
|
||
|
get := ps.get
|
||
|
assert(get() == 0)
|
||
|
incr()
|
||
|
incr()
|
||
|
incr()
|
||
|
assert(get() == 3)
|
||
|
}
|
||
|
|
||
|
func addressibleValuePointerReceiver() {
|
||
|
var s S
|
||
|
incr := s.incr
|
||
|
get := s.get
|
||
|
assert(get() == 0)
|
||
|
incr()
|
||
|
incr()
|
||
|
incr()
|
||
|
assert(get() == 3)
|
||
|
}
|
||
|
|
||
|
type S2 struct {
|
||
|
S
|
||
|
}
|
||
|
|
||
|
func promotedReceiver() {
|
||
|
var s2 S2
|
||
|
incr := s2.incr
|
||
|
get := s2.get
|
||
|
assert(get() == 0)
|
||
|
incr()
|
||
|
incr()
|
||
|
incr()
|
||
|
assert(get() == 3)
|
||
|
}
|
||
|
|
||
|
func anonStruct() {
|
||
|
var s struct{ S }
|
||
|
incr := s.incr
|
||
|
get := s.get
|
||
|
assert(get() == 0)
|
||
|
incr()
|
||
|
incr()
|
||
|
incr()
|
||
|
assert(get() == 3)
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
valueReceiver()
|
||
|
pointerReceiver()
|
||
|
addressibleValuePointerReceiver()
|
||
|
promotedReceiver()
|
||
|
anonStruct()
|
||
|
}
|