点击上方蓝色“Golang来啦”关注我哟
加个“星标”,天天 15 分钟,一起学 Go
你好哇,欢迎来答题,一起来看下昨天题目的解析:
1.下面代码有什么问题?
1func main() {
2 ch := make(chan int, 1000)
3 go func() {
4 for i := 0; i < 10; i++ {
5 ch <- i
6 }
7 }()
8 go func() {
9 for {
10 a, ok := <-ch
11 if !ok {
12 fmt.Println("close")
13 return
14 }
15 fmt.Println("a: ", a)
16 }
17 }()
18 close(ch)
19 fmt.Println("ok")
20 time.Sleep(time.Second * 20)
21}
参考答案及解析:panic。协程开启还未来得及执行,chan 就已经 close() ,往已经关闭的 chan 写数据会 panic。
2.在 A 处添加一行代码实现 S 按升序排列。
1type S struct {
2 v int
3}
4
5func main() {
6 s := []S{{1}, {3}, {5}, {2}}
7 // A
8 fmt.Printf("%#v", s)
9}
参考答案及解析:可以考虑使用 sort.Slice()。
1type S struct {
2 v int
3}
4
5func main() {
6 s := []S{{1}, {3}, {5}, {2}}
7 sort.Slice(s, func(i, j int) bool { return s[i].v < s[j].v })
8 fmt.Printf("%#v", s)
9}
解析若有不妥之处,欢迎在留言区交流、指正!
看下今天的题目:
1.下面代码输出什么?请简要说明。
1type T struct {
2 V int
3}
4
5func (t *T) Incr(wg *sync.WaitGroup) {
6 t.V++
7 wg.Done()
8}
9func (t *T) Print() {
10 time.Sleep(1)
11 fmt.Print(t.V)
12}
13func main() {
14 var wg sync.WaitGroup
15 wg.Add(10)
16 var ts = make([]T, 10)
17 for i := 0; i < 10; i++ {
18 ts[i] = T{i}
19 }
20 for _, t := range ts {
21 go t.Incr(&wg)
22 }
23 wg.Wait()
24 for _, t := range ts {
25 go t.Print()
26 }
27 time.Sleep(5 * time.Second)
28}
A. 输出 12345678910;
B. 输出 0123456789;
C. 输出 9999999999;
D. panic;
2.下面的代码可以随机输出大小写字母,尝试在 A 处添加一行代码使得字母先按大写再按小写的顺序输出。
1const N = 26
2
3func main() {
4 const GOMAXPROCS = 1
5 runtime.GOMAXPROCS(GOMAXPROCS)
6
7 var wg sync.WaitGroup
8 wg.Add(2 * N)
9 for i := 0; i < N; i++ {
10 go func(i int) {
11 defer wg.Done()
12 // A
13 runtime.Gosched()
14 fmt.Printf("%c", 'a'+i)
15 }(i)
16 go func(i int) {
17 defer wg.Done()
18 fmt.Printf("%c", 'A'+i)
19 }(i)
20 }
21 wg.Wait()
22}
引自博客《鸟窝》 https://colobu.com/
答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!
ps:看完文章如果有收获,顺手花 1s 时间帮点下文末右下方的「在看」,感激!
所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!
推荐阅读:
如果我的文章对你有所帮助,点赞、转发都是一种支持!
给个[在看],是对四哥最大的支持