V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaqi
V2EX  ›  程序员

Py 狗转 Go 面试遇到问题

  •  
  •   xiaqi · 2018-06-08 20:03:02 +08:00 · 6305 次点击
    这是一个创建于 2110 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一. 先是基本的 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 后台系统,如何实现扩展?如何实现高可用?
    28 条回复    2018-06-10 11:58:54 +08:00
    purebluesong
        1
    purebluesong  
       2018-06-08 20:30:29 +08:00
    真慌,侥幸拿到了 go 的 offer,然而面试的时候还只会吹比 python
    xiaqi
        2
    xiaqi  
    OP
       2018-06-08 21:11:48 +08:00
    @purebluesong 真厉害。我还没有拿到.wuwu
    xiaqi
        3
    xiaqi  
    OP
       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
        4
    EchoUtopia  
       2018-06-08 21:47:45 +08:00 via Android   ❤️ 1
    我来做的话,queue 加维护生产者和消费者列表的数据结构(用来通知 queue 关闭)来实现 channel,屏蔽关键字的话用前缀树,比较简单。或者布隆过滤器?公共数字的话把一个数组放 map 里面,便利第二个看在不在 map 里面。等式我太菜搞不定哈哈,动态规划?爬虫太笼统不好答。热更的话感觉每个语言都可以搞,开个新进程)网关把新用户导入
    EchoUtopia
        5
    EchoUtopia  
       2018-06-08 21:50:48 +08:00 via Android
    开个新进程或者服务,网关把新进来的用户导入到新进程,等老进程用户走完就关掉它。后面那个不是很懂,实现扩展,微服务?高可用分布式一致性?
    ToT
        6
    ToT  
       2018-06-08 21:54:35 +08:00
    @EchoUtopia bloomfilter 听起来不错。我是准备面试的时候才知道这个用法的。请问您平时用到过么?这种知识在哪里可以系统学习呢?
    gamexg
        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.什么类型?
    先是数据库和应用独立,然后加应用服务器,加缓存,数据库碰到瓶颈就读写分离,分库分表。
    c0pper
        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)
    a7a2
        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 方式实现智能服务。
    xiaqi
        10
    xiaqi  
    OP
       2018-06-08 22:50:48 +08:00
    @c0pper
    2. 对,a := make([]int, 20) 这个写错了。
    6. 对,我回来运行,发现确实是都可以。但是,很明显,这是有区别的。然后,就是,它要求,用个办法在代码里区别出来。面试官当时讲了下,用 interface{} 和 map
    xiaqi
        11
    xiaqi  
    OP
       2018-06-08 22:52:58 +08:00
    @EchoUtopia 大佬,实现 chan 那个,有空要不要写下共享下呀?
    xiaqi
        12
    xiaqi  
    OP
       2018-06-08 23:04:58 +08:00
    #10 a := make([]int, 5, 20)
    xiaqi
        13
    xiaqi  
    OP
       2018-06-08 23:12:32 +08:00
    @EchoUtopia 前缀树,BloomFilter 学习了
    happywowwow
        14
    happywowwow  
       2018-06-08 23:23:18 +08:00   ❤️ 1

    1. AC 算法和 WM 算法, 关键词搜多模匹配
    EchoUtopia
        15
    EchoUtopia  
       2018-06-08 23:25:31 +08:00 via Android
    @xiaqi 网上应该很多 channel 实现原理吧,我也找个时间去学习下
    EchoUtopia
        16
    EchoUtopia  
       2018-06-08 23:25:59 +08:00 via Android
    @ToT 听别人吹比的时候了解过
    xiaqi
        17
    xiaqi  
    OP
       2018-06-08 23:26:24 +08:00
    xiaqi
        18
    xiaqi  
    OP
       2018-06-08 23:27:10 +08:00
    @EchoUtopia 恩,好,我也再看看
    zhujinliang
        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 种可能
    yhzwy
        20
    yhzwy  
       2018-06-09 02:22:28 +08:00
    你们都是工作几年转行啊。。
    ToT
        21
    ToT  
       2018-06-09 05:49:05 +08:00
    @EchoUtopia 哈哈哈。别人是怎么学到的呢?实际用过吗
    wweir
        22
    wweir  
       2018-06-09 06:18:56 +08:00 via Android
    一 3 老司机表示即使答不上来这种无聊的题,即使能答上来也不想答
    xiaqi
        23
    xiaqi  
    OP
       2018-06-09 06:57:12 +08:00 via Android
    @wweir 不不不,这个不仅仅是基本的,而且,还承接下一题,初始化的默认值。

    当时我是没列完,然后我回来,再列了下(不知道有没漏)
    int, float, string, array, slice, map, interface, struct, chan, complex

    它们是否有默认初始值,有的话是多少?
    还有 int,int32,int64,float,float32,float64
    这类,初始值是否一样?
    missdeer
        24
    missdeer  
       2018-06-09 07:48:29 +08:00 via Android
    好慌,这么些年 go 白写了
    yepinf
        25
    yepinf  
       2018-06-09 07:59:23 +08:00
    server 热更新原理不都是一样的吗
    xiaqi
        26
    xiaqi  
    OP
       2018-06-09 08:28:30 +08:00 via Android
    @yepinf 像 Python,知道像模块可以 reload,然后 autoreload.pypyded_reload.py 。但是 Go 的 grace,上面楼没说的话,还真不知道!

    当然其他办法,像上面大佬说的,代理+队列,开个新进程或者服务,网关把新进来的用户导入到新进程,等老进程用户走完就关掉它。

    第三其他问题,我感觉应该是除了语言相关,就是应该跟架构相关
    abmin521
        27
    abmin521  
       2018-06-10 10:06:51 +08:00
    Yoock
        28
    Yoock  
       2018-06-10 11:58:54 +08:00 via iPhone   ❤️ 1
    写了两年的 go,没有回答语法题的欲望
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3360 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 11:35 · PVG 19:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.