1.下面这段代码输出什么
func main() {
ns := []int{010: 200, 005: 100}
print(len(ns))
}
答案
输出:9
原因:0开头的表示8进制,ns的结果是:[0 0 0 0 0 100 0 0 200],005: 100表示位置5的值是100,010: 200表示位置8的值是200,所以len(ns)=9
ns := []int{m:n} 表示的是在切片ns中下标为m(从0开始)的值是n
2.下面这段代码输出什么
func main() {
i := 0
f := func() int {
i++
return i
}
c := make(chan int, 1)
c <- f()
select {
case c <- f():
default:
fmt.Println(i)
}
}
答案
输出:2
原因:c <- f() 表示执行了一下f函数,此时i=1并且f函数返回值也是1,将1放到c中,由于c的大小是1,此时并没有阻塞。
然后执行到select,此时会尝试执行一下 c <-f();发现会被阻塞,定时此时f函数已经被执行了,所以i等于2,然后发现这个case执行不了,就执行default,输出2
加如改成如下:
func main() {
i := 0
f := func() int {
i++
fmt.Println("222")
return i
}
c := make(chan int, 1)
d := make(chan int, 0)
e := make(chan int, 0)
c <- f()
fmt.Println("111")
select {
case c <- f():
case d <- f():
case e <- f():
default:
fmt.Println(i)
}
}
则会输出:4。每个case都会尝试执行一次,但是都执行不成功,最后执行default。