两个 goroutine 用 channel 通信,一个 goroutine 顺序发送 0,1,2,3,4 个数字,另一个 goroutine 接收并输出。 考察了 goroutine 的控制、channel 的关闭等基础知识,面试者写的代码各种问题。
上周面试 5 个人只有 1 个人一次写出了执行没问题的代码,有 1 个经过提示也没写出来,剩下的能提示后逐步修改出正确的代码。
这个题还是很经典的,不用问 GMP 、垃圾回收算法等八股文,这个题就能看出 go 基础了。
103
felixfw1111x 32 天前
package main
import "fmt" func main() { ch, done := make(chan int), make(chan bool) go func() { for i := 0; i <= 4; i++ { ch <- i } close(ch) }() go func() { for i := range ch { fmt.Print(i, " ") } done <- true }() <-done } |
104
harlen 29 天前
func TestPrint(_ *testing.T) {
ch := make(chan int) done := make(chan struct{}) go func() { defer close(ch) for i := 0; i < 5; i++ { ch <- i } }() go func() { end: for { select { case v, ok := <-ch: if !ok { fmt.Println("close ch") break end } fmt.Println(v) default: //兜底处理 } } done <- struct{}{} }() <-done } 这玩意,web 方向除了专门练习过,日常哪有业务需要用到 goroutinue. 游戏方向异步刷库,优先级任务这些可能会用到,大部分还是用来做基础设施可能用到的。很多专注业务处理的业务仔,都是前面被这些面试题坑了之后,再回去练习的。 就比如面试的时候,遇到个问题 var a := [...]int{1, 2, 3, 4, 5, 6} 是数组还是切片。 func PrintA(nums []int){ fmt.Println(nums) } PrintA(a) 会报错吗 |
105
0x3751 29 天前
初级水平:使用基本的 channel 使用
中级水平:使用 sync.WaitGroup ,展示标准库同步原语的应用 高级水平:使用 done channel 或 context |