zoukankan      html  css  js  c++  java
  • Golang3到5年常见的面试题

    1、go中常量是怎么实现

    2、go struct能不能比较

    因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型
    

    3、go defer(for defer),先进后出,后进先出

    func b() {
        for i := 0; i < 4; i++ {
            defer fmt.Print(i)
        }
    }

    4、golang的make和new的区别是什么

    new有点像c++里面的new,用来初始化各种type,然后返回其指针。 只不过由于没有构造函数的存在,所以全部用零值来填充,比较特殊的是slice,map,channel, 它们的零值都是nil。另外由于golang直接可以用&struct{} 形式来初始化,所以平时用到new的机会也比较少。
    make是用来初始化map,slice,以及channel的, 它返回的不是指针,而是对象本身。另外,make出来的map,slice,channel都是可以直接使用的。

    5、golang 的channel是怎么实现的

    golang的channel是个结构体,里面大概包含了三大部分:
    a. 指向内容的环形缓存区,及其相关游标
    b. 读取和写入的排队goroutine链表
    c. 锁
    任何操作前都需要获得锁, 当写满或者读空的时候,就将当前goroutine加入到recvq或者sendq中, 并出让cpu(gopark)。

    6、简单描述下golang的gc算法

    golang现行的gc算法是三色标记法,三色指的是在gc过程中会把对象标记给黑,灰,白三色。
    三色标记法是对标记-清除算法的优化,目的是减少stop the world的时间。

    7、recover能处理所有的异常吗

    8、select可以用于什么,常用语gorotine的完美退出

    golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作
    每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作
    

    9、context包的用途

    Context通常被译作上下文,它是一个比较抽象的概念,其本质,是【上下上下】存在上下层的传递,上会把内容传递给下。在Go语言中,程序单元也就指的是Goroutine

    10、client如何实现长连接

    11、主协程如何等其余协程完再操作

    使用channel进行通信,context,select
    

    12、slice,len,cap,共享,扩容

    append函数,因为slice底层数据结构是,由数组、len、cap组成,所以,在使用append扩容时,会查看数组后面有没有连续内存快,有就在后面添加,没有就重新生成一个大的素组
    

    13、map如何顺序读取

    map不能顺序读取,是因为他是无序的,想要有序读取,首先的解决的问题就是,把key变为有序,所以可以把key放入切片,对切片进行排序,遍历切片,通过key取值。
    

    14、实现set

    type inter interface{}
    type Set struct {
        m map[inter]bool
        sync.RWMutex
    }
     
    func New() *Set {
        return &Set{
        m: map[inter]bool{},
        }
    }
    func (s *Set) Add(item inter) {
        s.Lock()
        defer s.Unlock()
        s.m[item] = true
    }

    15、实现消息队列(多生产者,多消费者)

    使用切片加锁可以实现
    

    16、大文件排序

    归并排序,分而治之,拆分为小文件,在排序
    

    17、基本排序,哪些是稳定的

    18、http能不能一次连接多次请求,不等后端返回

    http本质上市使用socket连接,因此发送请求,接写入tcp缓冲,是可以多次进行的,这也是http是无状态的原因
    

    19、tcp与udp区别,udp优点,适用场景

    tcp传输的是数据流,而udp是数据包,tcp会进过三次握手,udp不需要

    20、孤儿进程,僵尸进程

    21、Slice与数组区别,Slice底层结构

    22、项目里的微信支付这块,在支付完微信通知这里,收到两次微信相同的支付通知,怎么防止重复消费(类似接口的幂等性),说了借助Redis或者数据库的事务

    23、Go的反射包怎么找到对应的方法(这里忘记怎么问的,直接说不会,只用了DeepEqual,简单讲了DeepEqual)

    24、Mysql的索引有几种,时间复杂度

    25、Go的channel(有缓冲和无缓冲)

    26、退出程序时怎么防止channel没有消费完,

    27、生产者消费者模式,手写代码,channel缓冲长度怎么决定,怎么控制上游生产速度过快,这里没说出解决方案,只是简单说了channel长度可以与上下游的速度比例成线性关系

    29、手写循环队列,写的循环队列是不是线程安全,不是,怎么保证线程安全,加锁,效率有点低啊,Go推崇原子操作和channel

    30、TimeWait和CloseWait原因

    31、看过啥源码,nsq(Go的消息中间件)waitgroup包等

    32、sync.Pool用过吗,为什么使用,对象池,避免频繁分配对象(GC有关),那里面的对象是固定的吗?

    33、微服务,服务治理是怎么样的 

    34、证明二叉树的叶子节点跟度数为2的节点的关系

    35、智能指针

    36、字符串解析为数字(考虑浮点型)

    37、单点登录,tcp粘包
    38、手写洗牌

    39、处理粘包断包实现

    40、goroutine调度用了什么系统调用?

    41、进程虚拟空间分布,全局变量放哪里?答上来了,操作系统就不问了

    42、有没有网络编程,有,怎么看连接状态?netstat,有哪些?ESTABLISHED,LISTEN等等,有异常情况吗?TIME_WAIT很多,为什么?大量短链接

    43、几种基本排序算法说一下,问了堆的时间复杂度,稳定性,为什么不稳定

    44、 topk问题,海量数据topk,最长连续字串和,这里我说的解决方案没用dp(对dp不熟)

    45、项目我说只有一台机子,所以用的单机部署,面试官说单机也可以部署多个,有什么方法吗?我说docker,问docker有哪些网络,不熟,dockerfile关键字,只答几个。顺便扯了下nginx转发。

    46、数据库隔离级别,提交读会造成什么

    47、 goroutine泄漏有没有处理,设置timeout,select加定时器

    48、排序算法以及时间复杂度

    50、go的线程,给他讲了跟goroutine调度

    56、io模型,同步阻塞,同步非阻塞,异步

    57、redis分布式,如何减少同步延迟

    58、平时怎么学习?

    59、看过google四篇分布式论文吗?

    60、cap理论,举例

    61、LRU算法,LFU

    62、讲讲怎么理解网络编程

    63、go使用踩过什么坑(for range,数据库连接defer close)

    64、go优缺点

    65、go的值传递和引用

    67、m个n大小的有序数组求并集,一开始是2路归并,求时间复杂度,后来在面试官提醒直接m路归并,求时间复杂度

    68、static关键字,还有其他关键字吗

    69、hash表设计,线程安全?

    70、 线程自己独享什么

    71、网络编程过程

    72、select、epoll

    73、排行榜怎么实现

    74、go的锁如何实现,用了什么cpu指令

    75、go的runtime如何实现

    76、看过sql的连接池实现吗

    77、ctx包了解吗?有什么用?

    78、go什么情况下会发生内存泄漏?

    79、怎么实现协程完美退出?

    80、简单dp题,n*n矩阵从左上角到右下角有多少种走法(只限往下和往右走)

    81、用channel实现定时器?(实际上是两个协程同步)

    82、go为什么高并发好?go的调度模型

    83、操作系统内存管理?进程通讯,为什么共享存储区效率最高

    84、实现一个hashmap,解决hash冲突的方法,解决hash倾斜的方法

    85、怎么理解go的interface

    86、100亿个数选top5,小根堆

    87、数组和为n的数组对

    88、最大连续子数组和

    89、跳跃表,为什么使用跳跃表而不使用红黑树

    90、tcp怎么找到哪个套接字

    91、ipc方式,共享存储区原理

    92、进程虚拟空间布局

    93、进程状态转换

    94、线程的栈在哪里分配

    95、多个线程读,一个线程写一个int32会不会有问题,int64呢

    96、判断二叉树是否为满二叉树

  • 相关阅读:
    nio的学习
    并发编程学习(二)
    并发编程学习(一)
    linux基础知识-常用命令
    linux基础知识-目录结构
    springcloud的config
    zuul学习
    hystrix学习
    feign学习
    ribbon学习
  • 原文地址:https://www.cnblogs.com/chenpingzhao/p/13358378.html
Copyright © 2011-2022 走看看