mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	 052c942e20
			
		
	
	
		052c942e20
		
	
	
	
	
		
			
			Previously merely printing an error would cause the golden file comparison (in 'bash run') to fail, but that is no longer the case with the new run.go driver. R=iant CC=golang-dev https://golang.org/cl/7310087
		
			
				
	
	
		
			180 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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 nil.
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| type T struct {
 | |
| 	i int
 | |
| }
 | |
| 
 | |
| type IN interface{}
 | |
| 
 | |
| func main() {
 | |
| 	var i *int
 | |
| 	var f *float32
 | |
| 	var s *string
 | |
| 	var m map[float32]*int
 | |
| 	var c chan int
 | |
| 	var t *T
 | |
| 	var in IN
 | |
| 	var ta []IN
 | |
| 
 | |
| 	i = nil
 | |
| 	f = nil
 | |
| 	s = nil
 | |
| 	m = nil
 | |
| 	c = nil
 | |
| 	t = nil
 | |
| 	i = nil
 | |
| 	ta = make([]IN, 1)
 | |
| 	ta[0] = nil
 | |
| 
 | |
| 	_, _, _, _, _, _, _, _ = i, f, s, m, c, t, in, ta
 | |
| 
 | |
| 	arraytest()
 | |
| 	chantest()
 | |
| 	maptest()
 | |
| 	slicetest()
 | |
| }
 | |
| 
 | |
| func shouldPanic(f func()) {
 | |
| 	defer func() {
 | |
| 		if recover() == nil {
 | |
| 			panic("not panicking")
 | |
| 		}
 | |
| 	}()
 | |
| 	f()
 | |
| }
 | |
| 
 | |
| func shouldBlock(f func()) {
 | |
| 	go func() {
 | |
| 		f()
 | |
| 		panic("did not block")
 | |
| 	}()
 | |
| 	time.Sleep(1e7)
 | |
| }
 | |
| 
 | |
| // nil array pointer
 | |
| 
 | |
| func arraytest() {
 | |
| 	var p *[10]int
 | |
| 
 | |
| 	// Looping over indices is fine.
 | |
| 	s := 0
 | |
| 	for i := range p {
 | |
| 		s += i
 | |
| 	}
 | |
| 	if s != 45 {
 | |
| 		panic(s)
 | |
| 	}
 | |
| 
 | |
| 	s = 0
 | |
| 	for i := 0; i < len(p); i++ {
 | |
| 		s += i
 | |
| 	}
 | |
| 	if s != 45 {
 | |
| 		panic(s)
 | |
| 	}
 | |
| 
 | |
| 	// Looping over values is not.
 | |
| 	shouldPanic(func() {
 | |
| 		for i, v := range p {
 | |
| 			s += i + v
 | |
| 		}
 | |
| 	})
 | |
| 
 | |
| 	shouldPanic(func() {
 | |
| 		for i := 0; i < len(p); i++ {
 | |
| 			s += p[i]
 | |
| 		}
 | |
| 	})
 | |
| }
 | |
| 
 | |
| // nil channel
 | |
| // select tests already handle select on nil channel
 | |
| 
 | |
| func chantest() {
 | |
| 	var ch chan int
 | |
| 
 | |
| 	// nil channel is never ready
 | |
| 	shouldBlock(func() {
 | |
| 		ch <- 1
 | |
| 	})
 | |
| 	shouldBlock(func() {
 | |
| 		<-ch
 | |
| 	})
 | |
| 	shouldBlock(func() {
 | |
| 		x, ok := <-ch
 | |
| 		println(x, ok) // unreachable
 | |
| 	})
 | |
| 
 | |
| 	if len(ch) != 0 {
 | |
| 		panic(len(ch))
 | |
| 	}
 | |
| 	if cap(ch) != 0 {
 | |
| 		panic(cap(ch))
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // nil map
 | |
| 
 | |
| func maptest() {
 | |
| 	var m map[int]int
 | |
| 
 | |
| 	// nil map appears empty
 | |
| 	if len(m) != 0 {
 | |
| 		panic(len(m))
 | |
| 	}
 | |
| 	if m[1] != 0 {
 | |
| 		panic(m[1])
 | |
| 	}
 | |
| 	if x, ok := m[1]; x != 0 || ok {
 | |
| 		panic(fmt.Sprint(x, ok))
 | |
| 	}
 | |
| 
 | |
| 	for k, v := range m {
 | |
| 		panic(k)
 | |
| 		panic(v)
 | |
| 	}
 | |
| 
 | |
| 	// can delete (non-existent) entries
 | |
| 	delete(m, 2)
 | |
| 
 | |
| 	// but cannot be written to
 | |
| 	shouldPanic(func() {
 | |
| 		m[2] = 3
 | |
| 	})
 | |
| }
 | |
| 
 | |
| // nil slice
 | |
| 
 | |
| func slicetest() {
 | |
| 	var x []int
 | |
| 
 | |
| 	// nil slice is just a 0-element slice.
 | |
| 	if len(x) != 0 {
 | |
| 		panic(len(x))
 | |
| 	}
 | |
| 	if cap(x) != 0 {
 | |
| 		panic(cap(x))
 | |
| 	}
 | |
| 
 | |
| 	// no 0-element slices can be read from or written to
 | |
| 	var s int
 | |
| 	shouldPanic(func() {
 | |
| 		s += x[1]
 | |
| 	})
 | |
| 	shouldPanic(func() {
 | |
| 		x[2] = s
 | |
| 	})
 | |
| }
 |