Go面试题39
1: 关于无缓冲和有冲突的channel
,下面说法正确的是?
- A. 无缓冲的
channel
是默认的缓冲为1
的channel
. - 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
.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付
