GO每日一题(3)


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。


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录