腾讯csig运维实习生面经
面试岗位:运维实习生 150~200一天 腾讯,针不戳
先说体验吧,整体感觉真的很好,面试官老哥人好,沟通也很流畅,问问题讲的也清楚,生怕你没听懂还可以多讲几遍给你听。
面试主要问的Go语言的内容比较多,或者说问的都是Go相关的,前面问的都挺简单的:
①常量与变量的区别
②GC回收(老生常谈)
③反射与断言(这个我没答出来,我拉了,用少了也看少了)
但是后面叫我根据场景写需求的时候我就懵了,咱第一次被这样面,咱现在代码水平也比较拉胯,所以铁寄了:
场景:爬虫爬网站,用channel去接收与传出结果,要求爬失败了的网站该怎么用goroutine去解决。
这个场景其实挺简单的,但奈何自己太久没用channel和goroutine,没怎么写过相应的代码,拉垮了,写不出一点。
之后就是聊天环节了,老哥也是一眼发现了我的问题,让我去好好地把这些基础打好,然后看看k8s的源码或者大佬的代码,去理解他们代码的设计与思路,之后就可以尝试一下二次开发。
总结:这次虽然好好地介绍了自己,但因为自己基础能力综合运用真的不行,Golang特性也没有好好学好。通过面试官老哥的指点也让我明白了之后的方向该怎么走,至于算法,连写的机会都没有,更得提升。这次面试体验真的很好,算是遇到了贵人指点,过程老哥也知道我自学Go方向有点差错,指点了我。我估计这辈子遇不到多几个这样的贵人了。希望之后沉淀完能真的达到老哥说的境界,这样对自己也好,对之后自己拿对应岗位的薪资也有支柱能撑得起自己。
最后附上面试时候场景题的解答,确实不难:
package main
import (
"fmt"
"net/http"
"sync"
"time"
)
var waitGroup sync.WaitGroup
func main() {
ch := make(chan string)
waitGroup.Add(1)
//开一个协程
go func() {
defer waitGroup.Done()
res, err := http.Get("https://rolingg.top")
if err != nil {
ch <- fmt.Sprintf("爬虫爬网站出错, err: %s", err.Error())
} else {
defer res.Body.Close() // 确保关闭响应体
ch <- fmt.Sprintf("爬虫爬网站成功!status: %s\n", res.Status)
}
}()
//注意了,这里default获取结果要比case快的,因为协程中运行,肯定要比主线程慢一点,而且channel赋值要时间,就那一丢丢时间就足以让default先符合条件触发
//select {
//case result := <-ch:
// fmt.Println(result)
//case <-time.After(3 * time.Second):
// fmt.Println("爬虫爬取网站超时")
// return
//default:
// fmt.Println("奇奇怪怪")
//}
//注意,select在获得到结果之前也会阻塞,直至有一个条件符合才会往下走
select {
case result := <-ch:
fmt.Println(result)
case <-time.After(3 * time.Second):
fmt.Println("爬虫爬取网站超时")
return
}
close(ch)
}
到此一游