天天看点

Go 面试每天一篇(第 107 天)

你好哇,欢迎来答题,一起来看下昨天题目的解析:

1.下面代码输出什么?请简要说明。

1func main() {      2    var ch chan int      3    var count int      4    go func() {      5        ch <- 1      6    }()      7    go func() {      8        count++      9        close(ch)     10    }()     11    <-ch     12    fmt.Println(count)     13}      
  • A. 不能编译;
  • B. 输出 1;
  • C. 输出 0;
  • D. panic;

参考答案及解析:D。ch 未被初始化,关闭时会报错。

2.下面代码输出什么?请简要说明。

1func main() {      2    var ch chan int      3    go func() {      4        ch = make(chan int, 1)      5        ch <- 1      6    }()      7    go func(ch chan int) {      8        time.Sleep(time.Second)      9        <-ch     10    }(ch)     11     12    c := time.Tick(1 * time.Second)     13    for range c {     14        fmt.Printf("#goroutines: %d\n", runtime.NumGoroutine())     15    }     16}      
  • B. 一段时间后总是输出 #goroutines: 1;
  • C. 一段时间后总是输出 #goroutines: 2;

参考答案即解析:C。程序执行到第二个 groutine 时,ch 还未初始化,导致第二个 goroutine 阻塞。需要注意的是第一个 goroutine 不会阻塞。

解析若有不妥之处,欢迎在留言区交流、指正!

看下今天的题目:

1func main() {     2    var m sync.Map     3    m.LoadOrStore("a", 1)     4    m.Delete("a")     5    fmt.Println(m.Len())     6}      
1func main() {      2    var wg sync.WaitGroup      3    wg.Add(2)      4    var ints = make([]int, 0, 1000)      5    go func() {      6        for i := 0; i < 1000; i++ {      7            ints = append(ints, i)      8        }      9        wg.Done()     10    }()     11    go func() {     12        for i := 0; i < 1000; i++ {     13            ints = append(ints, i)     14        }     15        wg.Done()     16    }()     17    wg.Wait()     18    fmt.Println(len(ints))     19}      
  • B. 输出 2000;
  • C. 输出可能不是 2000;

引自博客《鸟窝》 https://colobu.com/

答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!

Go 面试每天一篇(第 107 天)

继续阅读