| // run | |
| // Copyright 2009 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. | |
| // Test functions and goroutines. | |
| package main | |
| func caller(f func(int, int) int, a, b int, c chan int) { | |
| c <- f(a, b) | |
| } | |
| func gocall(f func(int, int) int, a, b int) int { | |
| c := make(chan int) | |
| go caller(f, a, b, c) | |
| return <-c | |
| } | |
| func call(f func(int, int) int, a, b int) int { | |
| return f(a, b) | |
| } | |
| func call1(f func(int, int) int, a, b int) int { | |
| return call(f, a, b) | |
| } | |
| var f func(int, int) int | |
| func add(x, y int) int { | |
| return x + y | |
| } | |
| func fn() func(int, int) int { | |
| return f | |
| } | |
| var fc func(int, int, chan int) | |
| func addc(x, y int, c chan int) { | |
| c <- x+y | |
| } | |
| func fnc() func(int, int, chan int) { | |
| return fc | |
| } | |
| func three(x int) { | |
| if x != 3 { | |
| println("wrong val", x) | |
| panic("fail") | |
| } | |
| } | |
| var notmain func() | |
| func emptyresults() {} | |
| func noresults() {} | |
| var nothing func() | |
| func main() { | |
| three(call(add, 1, 2)) | |
| three(call1(add, 1, 2)) | |
| f = add | |
| three(call(f, 1, 2)) | |
| three(call1(f, 1, 2)) | |
| three(call(fn(), 1, 2)) | |
| three(call1(fn(), 1, 2)) | |
| three(call(func(a, b int) int { return a + b }, 1, 2)) | |
| three(call1(func(a, b int) int { return a + b }, 1, 2)) | |
| fc = addc | |
| c := make(chan int) | |
| go addc(1, 2, c) | |
| three(<-c) | |
| go fc(1, 2, c) | |
| three(<-c) | |
| go fnc()(1, 2, c) | |
| three(<-c) | |
| go func(a, b int, c chan int) { c <- a+b }(1, 2, c) | |
| three(<-c) | |
| emptyresults() | |
| noresults() | |
| nothing = emptyresults | |
| nothing() | |
| nothing = noresults | |
| nothing() | |
| } |