Go面试题39

Posted by     "" on Monday, January 6, 2020

Go面试题39

1: 关于无缓冲和有冲突的channel,下面说法正确的是?

  • A. 无缓冲的channel是默认的缓冲为1channel.
  • B. 无缓冲的channel和有缓冲的channel都是同步的.
  • C. 无缓冲的channel和有缓冲的channel都是非同步的.
  • D. 无缓冲的channel是同步的,而有缓冲的channel是非同步的.

2: 下面的代码是否能编译通过?, 如果通过, 输出什么?

func Foo(x interface{}) {
    if x == nil {
        fmt.Println("empty interface")
        return
    }

    fmt.Println("non-empty interface")
}

func main() {
    var x *int = nil
    Foo(x)
}

3: 下面代码输出什么?

func main() {
    ch := make(chan int, 100)
    // A
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
    }()
    // B
    go func() {
        for {
            a, ok := <-ch
            if !ok {
                fmt.Println("close")
                return
            }
            fmt.Println("a:", a)
        }
    }()

    close(ch)
    fmt.Println("ok")
    time.Sleep(time.Second * 10)


}

参考答案及解析

1: 答案: D

2: 答案及解析: non-empty interface 考点: interface 的内部结构, 我们知道除了有静态类型,还有动态类型和动态值,当且仅当动态值和动态类型都为nil时, 接口类型值才为nil.这里的x的动态类型是*int,所以x不为nil.

3: 答案及解析: 程序抛异常. 先定义下.第一个协程为A 协程, 第二个协程为B 协程; 当A 协程还没起时,主协程已经将channel关闭了,当A协程往关闭的channel发送数据时会panic, panic: send on closed channel.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付