go nil 源码

  • 2022-07-15
  • 浏览 (841)

golang nil 代码

文件路径:/test/nil.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
	})
}

相关信息

go 源码目录

相关文章

go 235 源码

go 64bit 源码

go alg 源码

go alias 源码

go alias1 源码

go alias2 源码

go alias3 源码

go align 源码

go append 源码

go append1 源码

0  赞