Go 面试每天一篇(第 102 天) - Go语言中文社区

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


点击上方蓝色“Golang来啦”关注我哟

加个“星标”,天天 15 分钟,一起学 Go

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

1.关于循环语句,下面说法正确的有?

  • A. 循环语句既支持 for 关键字,也支持 while 和 do-while;

  • B. 关键字for的基本使用方法与C/C++中没有任何差异;

  • C. for 循环支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环;

  • D. for 循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量;

参考答案及解析:CD。

2.下面代码的功能是从小到大找出 17 和 38 的 3 个公倍数,请问下面的代码有什么问题?

 1var ch chan int = make(chan int)
 2
 3func generate() {
 4    for i := 17; i < 5000; i += 17 {
 5        ch <- i
 6        time.Sleep(1 * time.Millisecond)
 7    }
 8    close(ch)
 9}
10
11func main() {
12    timeout := time.After(800 * time.Millisecond)
13    go generate()
14    found := 0
15    for {
16        select {
17        case i, ok := <-ch:
18            if ok {
19                if i%38 == 0 {
20                    fmt.Println(i, "is a multiple of 17 and 38")
21                    found++
22                    if found == 3 {
23                        break
24                    }
25                }
26            } else {
27                break
28            }
29        case <-timeout:
30            fmt.Println("timed out")
31            break
32        }
33    }
34    fmt.Println("The end")
35}

参考答案即解析:break 会跳出 select 块,但不会跳出 for 循环。这算是一个比较容易掉的坑。可以使用 break label 特性或者 goto 功能解决这个问题,这里使用 break label 作个示例。

 1var ch chan int = make(chan int)
 2
 3func generate() {
 4    for i := 17; i < 5000; i += 17 {
 5        ch <- i
 6        time.Sleep(1 * time.Millisecond)
 7    }
 8    close(ch)
 9}
10
11func main() {
12    timeout := time.After(800 * time.Millisecond)
13    go generate()
14    found := 0
15    MAIN_LOOP:
16    for {
17        select {
18        case i, ok := <-ch:
19            if ok {
20                if i%38 == 0 {
21                    fmt.Println(i, "is a multiple of 17 and 38")
22                    found++
23                    if found == 3 {
24                        break MAIN_LOOP
25                    }
26                }
27            } else {
28                break MAIN_LOOP
29            }
30        case <-timeout:
31            fmt.Println("timed out")
32            break MAIN_LOOP
33        }
34    }
35    fmt.Println("The end")
36}

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

看下今天的题目:

1.ch := make(chan interface{}) 和 ch := make(chan interface{},1) 有什么区别?

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

 1var mu sync.Mutex
 2var chain string
 3
 4func main() {
 5    chain = "main"
 6    A()
 7    fmt.Println(chain)
 8}
 9func A() {
10    mu.Lock()
11    defer mu.Unlock()
12    chain = chain + " --> A"
13    B()
14}
15
16func B() {
17    chain = chain + " --> B"
18    C()
19}
20
21func C() {
22    mu.Lock()
23    defer mu.Unlock()
24    chain = chain + " --> C"
25}
  • A. 不能编译;

  • B. 输出 main --> A --> B --> C;

  • C. 输出 main;

  • D. fatal error;

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

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

ps:看完文章如果有收获,顺手花 1s 时间帮点下文末右下方的「在看」,感激!

所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!

推荐阅读:

Go 语言机制之栈与指针

如果 map 不是引用变量,那是什么?

如果我的文章对你有所帮助,点赞、转发都是一种支持!

给个[在看],是对四哥最大的支持
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/asd1126163471/article/details/103535310
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 18:08:50
  • 阅读 ( 962 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢