1
purebluesong 2018-06-08 20:30:29 +08:00
真慌,侥幸拿到了 go 的 offer,然而面试的时候还只会吹比 python
|
2
xiaqi OP @purebluesong 真厉害。我还没有拿到.wuwu
|
3
xiaqi OP 最后的那个还好。按我理解,应该算是可以跟 python 的应该可以一样。
三. 1. 首先就是把要爬的任务放到 redis 队列。然后,其他机器再从 redis 队列里面取任务。然后爬虫的机器起 goroutine。 最后写数据库,可能也要搞个 redis 队列就好了。 2. Python 是可以实现模块热更. Go 如何实现模块热更的? 这个,真不知道。 然后,我的想法是,用 redis,缓存数据请求,然后,可以把 Go server 停止,再更换。 不知道其他办法了 3. 按我的理解,基本就是,nginx 做负载均衡。然后,数据库的话,看读写分离,分表分库这样。 然后第二 1. 不懂 2. 合并,快排序,遍历前后对比 3. 不懂 求大神们 解惑解惑呀 |
4
EchoUtopia 2018-06-08 21:47:45 +08:00 via Android 1
我来做的话,queue 加维护生产者和消费者列表的数据结构(用来通知 queue 关闭)来实现 channel,屏蔽关键字的话用前缀树,比较简单。或者布隆过滤器?公共数字的话把一个数组放 map 里面,便利第二个看在不在 map 里面。等式我太菜搞不定哈哈,动态规划?爬虫太笼统不好答。热更的话感觉每个语言都可以搞,开个新进程)网关把新用户导入
|
5
EchoUtopia 2018-06-08 21:50:48 +08:00 via Android
开个新进程或者服务,网关把新进来的用户导入到新进程,等老进程用户走完就关掉它。后面那个不是很懂,实现扩展,微服务?高可用分布式一致性?
|
6
ToT 2018-06-08 21:54:35 +08:00
@EchoUtopia bloomfilter 听起来不错。我是准备面试的时候才知道这个用法的。请问您平时用到过么?这种知识在哪里可以系统学习呢?
|
7
gamexg 2018-06-08 22:04:26 +08:00 1
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.什么类型? 先是数据库和应用独立,然后加应用服务器,加缓存,数据库碰到瓶颈就读写分离,分库分表。 |
8
c0pper 2018-06-08 22:07:34 +08:00 1
一
2. 不能那样用吧,make 不能初始化,而且只能 a := make([]int, 20) 6. 都能 https://play.golang.org/p/Z7FOxRtgyiI 但 lz 你又写错了 7. 不知道,不然我也跑去用 asyncio 了 二 1. hashmap? 2. 蠢方法,打表,每个遍历一次,最后遍历一次表,o(n) |
9
a7a2 2018-06-08 22:22:19 +08:00 1
三. 其他问题
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 方式实现智能服务。 |
10
xiaqi OP @c0pper
2. 对,a := make([]int, 20) 这个写错了。 6. 对,我回来运行,发现确实是都可以。但是,很明显,这是有区别的。然后,就是,它要求,用个办法在代码里区别出来。面试官当时讲了下,用 interface{} 和 map |
11
xiaqi OP @EchoUtopia 大佬,实现 chan 那个,有空要不要写下共享下呀?
|
12
xiaqi OP #10 a := make([]int, 5, 20)
|
13
xiaqi OP @EchoUtopia 前缀树,BloomFilter 学习了
|
14
happywowwow 2018-06-08 23:23:18 +08:00 1
二
1. AC 算法和 WM 算法, 关键词搜多模匹配 |
15
EchoUtopia 2018-06-08 23:25:31 +08:00 via Android
@xiaqi 网上应该很多 channel 实现原理吧,我也找个时间去学习下
|
16
EchoUtopia 2018-06-08 23:25:59 +08:00 via Android
@ToT 听别人吹比的时候了解过
|
17
xiaqi OP @happywowwow 66666
|
18
xiaqi OP @EchoUtopia 恩,好,我也再看看
|
19
zhujinliang 2018-06-08 23:57:22 +08:00 1
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 种可能 |
20
yhzwy 2018-06-09 02:22:28 +08:00
你们都是工作几年转行啊。。
|
21
ToT 2018-06-09 05:49:05 +08:00
@EchoUtopia 哈哈哈。别人是怎么学到的呢?实际用过吗
|
22
wweir 2018-06-09 06:18:56 +08:00 via Android
一 3 老司机表示即使答不上来这种无聊的题,即使能答上来也不想答
|
23
xiaqi OP @wweir 不不不,这个不仅仅是基本的,而且,还承接下一题,初始化的默认值。
当时我是没列完,然后我回来,再列了下(不知道有没漏) int, float, string, array, slice, map, interface, struct, chan, complex 它们是否有默认初始值,有的话是多少? 还有 int,int32,int64,float,float32,float64 这类,初始值是否一样? |
24
missdeer 2018-06-09 07:48:29 +08:00 via Android
好慌,这么些年 go 白写了
|
25
yepinf 2018-06-09 07:59:23 +08:00
server 热更新原理不都是一样的吗
|
26
xiaqi OP @yepinf 像 Python,知道像模块可以 reload,然后 autoreload.py 、pyded_reload.py 。但是 Go 的 grace,上面楼没说的话,还真不知道!
当然其他办法,像上面大佬说的,代理+队列,开个新进程或者服务,网关把新进来的用户导入到新进程,等老进程用户走完就关掉它。 第三其他问题,我感觉应该是除了语言相关,就是应该跟架构相关 |
27
abmin521 2018-06-10 10:06:51 +08:00
|
28
Yoock 2018-06-10 11:58:54 +08:00 via iPhone 1
写了两年的 go,没有回答语法题的欲望
|