go select 与 for 区别_Go 面试每天一篇(第 102 天)

本文围绕Go语言展开,包含昨天题目的解析,如循环语句相关选择题答案为CD,还指出找公倍数代码中break会跳出select块但不跳出for循环的问题及解决办法。此外,给出了今天的题目,如通道创建区别及代码输出判断等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击上方蓝色“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  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 := 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 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  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 := 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 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 不是引用变量,那是什么?

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

610df0dc456a99844aa2977d4ad741cd.gif

5f616340c0e27dbf3ec1837aad73a99f.png

给个[在看],是对四哥最大的支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值