社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
点击上方蓝色“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 时间帮点下文末右下方的「在看」,感激!
所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!
推荐阅读:
如果我的文章对你有所帮助,点赞、转发都是一种支持!
给个[在看],是对四哥最大的支持
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!