Py 狗转 Go 面试遇到问题

2018-06-08 20:03:02 +08:00
 xiaqi
一. 先是基本的 Go 语言问题

1. cap(map) 是否正确? 请说明理由
2. a := make(int, 5, 20)
fmt.Println(a[6])
fmt.Println(a[6:10])
输出的结果是啥?

3. 列出 golang 的所有数据类型

4. 所有数据类型定义时候的默认值

5. lst := []int{1,2,3,4,5}
for i, v := range lst{
/* 如何判断 range 是否有拷贝 lst 一个副本? */

}

6.
type A struct {}
func (a A) m() {
fmt.Println("func m...")
}
func (a *A) n() {
fmt.Println("func n...")
}

ao := A{}
ao.m()
ao.n()

ap := &A{}
ap.m()
ap.n()

/* 上面哪个无法运行? 为什么? 如果能运行, 使用什么方法能区别出来?或者说如何能使其中看起来不正确的使它不要运行? */


7. 用 Python 大致实现 Go 的 channel?


二.
1. 需要屏蔽 10 万个关键字, 写算法实现?
2. [2,3,4,5,7,8], [4,7,8,9,10] 提取公共的数字
3. 1 2 3 4 5 6 7 8 9=100,在里面插入+ 或 - 或者不插入符合(不插入符合,即 1 2 为 12) 使得等式成立? 暴力解法思路以及大概需要遍历多少种结果?



三. 其他问题
1. 爬虫,爬取数十亿的量的时候,应该怎么爬? (从开始,到数据爬取回来到存 数据库的整体)
2. Go server 如何实现热更?
3. server 后台系统,如何实现扩展?如何实现高可用?
6356 次点击
所在节点    程序员
28 条回复
purebluesong
2018-06-08 20:30:29 +08:00
真慌,侥幸拿到了 go 的 offer,然而面试的时候还只会吹比 python
xiaqi
2018-06-08 21:11:48 +08:00
@purebluesong 真厉害。我还没有拿到.wuwu
xiaqi
2018-06-08 21:23:14 +08:00
最后的那个还好。按我理解,应该算是可以跟 python 的应该可以一样。
三. 1. 首先就是把要爬的任务放到 redis 队列。然后,其他机器再从 redis 队列里面取任务。然后爬虫的机器起 goroutine。 最后写数据库,可能也要搞个 redis 队列就好了。
2. Python 是可以实现模块热更. Go 如何实现模块热更的? 这个,真不知道。 然后,我的想法是,用 redis,缓存数据请求,然后,可以把 Go server 停止,再更换。 不知道其他办法了
3. 按我的理解,基本就是,nginx 做负载均衡。然后,数据库的话,看读写分离,分表分库这样。


然后第二
1. 不懂
2. 合并,快排序,遍历前后对比
3. 不懂

求大神们 解惑解惑呀
EchoUtopia
2018-06-08 21:47:45 +08:00
我来做的话,queue 加维护生产者和消费者列表的数据结构(用来通知 queue 关闭)来实现 channel,屏蔽关键字的话用前缀树,比较简单。或者布隆过滤器?公共数字的话把一个数组放 map 里面,便利第二个看在不在 map 里面。等式我太菜搞不定哈哈,动态规划?爬虫太笼统不好答。热更的话感觉每个语言都可以搞,开个新进程)网关把新用户导入
EchoUtopia
2018-06-08 21:50:48 +08:00
开个新进程或者服务,网关把新进来的用户导入到新进程,等老进程用户走完就关掉它。后面那个不是很懂,实现扩展,微服务?高可用分布式一致性?
ToT
2018-06-08 21:54:35 +08:00
@EchoUtopia bloomfilter 听起来不错。我是准备面试的时候才知道这个用法的。请问您平时用到过么?这种知识在哪里可以系统学习呢?
gamexg
2018-06-08 22:04:26 +08:00
1. cap 时切片容量,map 应该不行。
2. make([]int,5,20)吧?
a[6]会炸,a[6:10]没问题。

3. 用到什么才想起来什么...

4. 字符串是 "" ,数字是 0,切片是 nil 也是空数组,map 必须初始化,否则是 nil ?

5.
lst[i]= 0
fmt.Printf("lst:%#v",lst)

6.应该能运行。
值是值传递,如果函数内修改了结构内数据可以认为无效,就有一次忘了打*排查了半天...
然后剩下的两个问题不清楚怎么解决。

7....


1.有现成的库及算法,细节记不清,需要查查。

2.小的话直接建个 map 省心,数据量大就排序处理。

3.6561


1. 感觉没什么难度,实际做的话需要压测下看看需要拆分到哪一步。

2. 什么类型的服务器?
http 之类的直接负载均衡切换到新服务器即可;游戏类的比较麻烦,记得 go 新版本出了个模块还是什么功能,可以热加载,游戏类的要么热切换 lua,要么用这个。
实际感觉这是个大坑,做动态更新配置并根据配置开关子服务就需要仔细测试,热替换子模块真的有可能运行中炸。

3.什么类型?
先是数据库和应用独立,然后加应用服务器,加缓存,数据库碰到瓶颈就读写分离,分库分表。
c0pper
2018-06-08 22:07:34 +08:00

2. 不能那样用吧,make 不能初始化,而且只能 a := make([]int, 20)
6. 都能 https://play.golang.org/p/Z7FOxRtgyiI 但 lz 你又写错了
7. 不知道,不然我也跑去用 asyncio 了


1. hashmap?
2. 蠢方法,打表,每个遍历一次,最后遍历一次表,o(n)
a7a2
2018-06-08 22:22:19 +08:00
三. 其他问题
1:
暂时不谈
2:
( 1 )、https://github.com/facebookgo/grace
( 2 )、还有一款工具可以做到的,原理就是代理+队列

3 ;
( 1 )、微服务、分布式、mq、流行的分片数据库集成高扩展性
( 2 )、api 统一网关,含前端实现的灾难发现及智能切换如前端代码检测到 api gateway A 不可用时候智能从 etcd server 中获取 api gateway B 或前端已经带有 api gateway b 自动访问切换。dns 方式实现智能服务。
xiaqi
2018-06-08 22:50:48 +08:00
@c0pper
2. 对,a := make([]int, 20) 这个写错了。
6. 对,我回来运行,发现确实是都可以。但是,很明显,这是有区别的。然后,就是,它要求,用个办法在代码里区别出来。面试官当时讲了下,用 interface{} 和 map
xiaqi
2018-06-08 22:52:58 +08:00
@EchoUtopia 大佬,实现 chan 那个,有空要不要写下共享下呀?
xiaqi
2018-06-08 23:04:58 +08:00
#10 a := make([]int, 5, 20)
xiaqi
2018-06-08 23:12:32 +08:00
@EchoUtopia 前缀树,BloomFilter 学习了
happywowwow
2018-06-08 23:23:18 +08:00

1. AC 算法和 WM 算法, 关键词搜多模匹配
EchoUtopia
2018-06-08 23:25:31 +08:00
@xiaqi 网上应该很多 channel 实现原理吧,我也找个时间去学习下
EchoUtopia
2018-06-08 23:25:59 +08:00
@ToT 听别人吹比的时候了解过
xiaqi
2018-06-08 23:26:24 +08:00
xiaqi
2018-06-08 23:27:10 +08:00
@EchoUtopia 恩,好,我也再看看
zhujinliang
2018-06-08 23:57:22 +08:00
6. 都能运行,编译器自动在调用时处理取值或取指针。编译器不希望你去处理这个问题,做区别是无意义的,应当在编写 A 的方法时确定应该传值还是传引用。当编译器无法取指针时,会报错,比如 aMap[key].Call(),因为无法对 aMap[key] 这个整体取址。


1. 关键字更新频繁:使用 sync.Map
几乎不更新:使用 atomic.Value 配合 map,参考 https://golang.org/pkg/sync/atomic/#Value 中的 Example (ReadMostly)

2. 两个数组分别排序,然后做一遍对比
for i, j := 0, 0; i < len(a) && j < len(b); {
if a[i] == b[i] {
fmt.Println(a[i])
i++
j++
} else if a[i] < j[i] {
i++
} else {
j++
}
}

或者使用短的数组做一个 map,然后遍历另一个数组(注意 map 初始大小足够,尽量避免扩容)

3. 9 个数字间有 8 个空位,每个空位有三种状态,共 3^8 种可能
yhzwy
2018-06-09 02:22:28 +08:00
你们都是工作几年转行啊。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/461618

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX