| // run | 
 |  | 
 | // Copyright 2016 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. | 
 |  | 
 | package main | 
 |  | 
 | import ( | 
 | 	"log" | 
 | 	"reflect" | 
 | ) | 
 |  | 
 | func test(got, want interface{}) { | 
 | 	if !reflect.DeepEqual(got, want) { | 
 | 		log.Fatalf("got %v, want %v", got, want) | 
 | 	} | 
 | } | 
 |  | 
 | func main() { | 
 | 	var i int | 
 | 	var ip *int | 
 | 	var ok interface{} | 
 |  | 
 | 	// Channel receives. | 
 | 	c := make(chan int, 1) | 
 | 	c2 := make(chan int) | 
 |  | 
 | 	c <- 42 | 
 | 	i, ok = <-c | 
 | 	test(i, 42) | 
 | 	test(ok, true) | 
 |  | 
 | 	c <- 42 | 
 | 	_, ok = <-c | 
 | 	test(ok, true) | 
 |  | 
 | 	c <- 42 | 
 | 	select { | 
 | 	case i, ok = <-c: | 
 | 		test(i, 42) | 
 | 		test(ok, true) | 
 | 	} | 
 |  | 
 | 	c <- 42 | 
 | 	select { | 
 | 	case _, ok = <-c: | 
 | 		test(ok, true) | 
 | 	} | 
 |  | 
 | 	c <- 42 | 
 | 	select { | 
 | 	case i, ok = <-c: | 
 | 		test(i, 42) | 
 | 		test(ok, true) | 
 | 	default: | 
 | 		log.Fatal("bad select") | 
 | 	} | 
 |  | 
 | 	c <- 42 | 
 | 	select { | 
 | 	case _, ok = <-c: | 
 | 		test(ok, true) | 
 | 	default: | 
 | 		log.Fatal("bad select") | 
 | 	} | 
 |  | 
 | 	c <- 42 | 
 | 	select { | 
 | 	case i, ok = <-c: | 
 | 		test(i, 42) | 
 | 		test(ok, true) | 
 | 	case <-c2: | 
 | 		log.Fatal("bad select") | 
 | 	} | 
 |  | 
 | 	c <- 42 | 
 | 	select { | 
 | 	case _, ok = <-c: | 
 | 		test(ok, true) | 
 | 	case <-c2: | 
 | 		log.Fatal("bad select") | 
 | 	} | 
 |  | 
 | 	close(c) | 
 | 	i, ok = <-c | 
 | 	test(i, 0) | 
 | 	test(ok, false) | 
 |  | 
 | 	_, ok = <-c | 
 | 	test(ok, false) | 
 |  | 
 | 	// Map indexing. | 
 | 	m := make(map[int]int) | 
 |  | 
 | 	i, ok = m[0] | 
 | 	test(i, 0) | 
 | 	test(ok, false) | 
 |  | 
 | 	_, ok = m[0] | 
 | 	test(ok, false) | 
 |  | 
 | 	m[0] = 42 | 
 | 	i, ok = m[0] | 
 | 	test(i, 42) | 
 | 	test(ok, true) | 
 |  | 
 | 	_, ok = m[0] | 
 | 	test(ok, true) | 
 |  | 
 | 	// Type assertions. | 
 | 	var u interface{} | 
 |  | 
 | 	i, ok = u.(int) | 
 | 	test(i, 0) | 
 | 	test(ok, false) | 
 |  | 
 | 	ip, ok = u.(*int) | 
 | 	test(ip, (*int)(nil)) | 
 | 	test(ok, false) | 
 |  | 
 | 	_, ok = u.(int) | 
 | 	test(ok, false) | 
 |  | 
 | 	u = 42 | 
 | 	i, ok = u.(int) | 
 | 	test(i, 42) | 
 | 	test(ok, true) | 
 |  | 
 | 	_, ok = u.(int) | 
 | 	test(ok, true) | 
 |  | 
 | 	u = &i | 
 | 	ip, ok = u.(*int) | 
 | 	test(ip, &i) | 
 | 	test(ok, true) | 
 |  | 
 | 	_, ok = u.(*int) | 
 | 	test(ok, true) | 
 | } |