面试总结

面试总结

channel 相关

channel为什么能保证线程安全
    发送一个数据到channel和从channel中接收一个数据都是原子性的。而且go的设计思想就是不要通过共享内存进行通信,而是通过通信共享内存,前者就是传统的加锁,后者是channel。设计channel的主要目的就是在多任务间传递数据,这当然是安全的

切片扩容规则
    原切片长度小于1024时,新切片的容量会按照原切片的2倍扩容,否则,新切片的容量会按照原切片的1.25倍扩容,此时需要注意的是,如果新切片的容量的容量按照原切片的1.25倍扩容仍然无法存储新元素时,将不会按照原切片的1.25倍扩容,直到新切片的容量可以存储原切片的元素和新元素为止。一般最终扩容后的新切片,它的容量会大于或等于原切片的容量。
    需要注意的是当切片的零值是nil时,切片此时还没有指向底层数组。但是切片的零值是可用的,当使用append向零值切片追加元素时,将会先个切片分配一个底层数组。
    切片扩容实际是创建一个新的底层数组,把原切片的元素和新元素一起拷贝到新切片的底层数组中,原切片的底层数组将会被垃圾回收。
    注意:切片的容量可以根据元素的个数的增多自动扩容,但是不会根据元素的个数的减少自动扩容。

字符串 相关

构建字符串 rune
Golang中的字符串底层是[]byte数组实现的。中文字符在unicode下占两个字符,在utf-8下占三个字节,golang默认编码是utf-8
Golang中还有一个byte数据类型和rune类似,它们都是用来表示字符类型的变量类型。它们的不同在于:
byte等同于int8,常用来处理ascii字符。
rune等同于int32,常用来处理unicode或utf-8字符。
golang中的unicode/utf8包提供了用utf-8获取长度的方法

面向对象 相关

函数,方法和接口
    Go语言中函数有具名和匿名之分,具名函数一般应用于包级函数,是匿名函数的一种特列。当匿名函数引用了外部作用于中的变量时就成了闭包函数。
    方法是绑定到一个具体类型的特殊函数,Go语言中的方法依托于类型的,必须在编译时静态绑定。
    接口定义了方法的集合,这些方法依托于运行时的接口对象,因此接口对应的方法是在运行动时动态绑定的。Go语言通过隐式接口机制实现了鸭子面向对象类型。
    Go的接口类型是对其他类型行为的的抽象和概括,因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让对象更加灵活,更有适应能力。接口类型是延迟绑定,可以实现类似虚函数的多态功能。
    Go语言中,基础类型(非接口类型)不支持隐式转换,我们无法将一个int类型的值直接赋值给int64类型的变量。但是Go语言对于接口类型的转换非常灵活。对象和接口之间转换,接口和接口的转换都可能是隐式的转换。

map 相关

delete方法删除一个不存在的key 会发生什么情况
不会返回错误

nginx 相关

正向代理和反向代理
https配置过程

redis 相关

  • 如何实现一个队列

    1. 生产者消费者模式
      普通版本
      比如一个队列里面,生产者A push了一个数据进去, 消费者B pop了这个数据,那么这个队列依旧为空。所以是一对一的。至于是先进先出还是后进后出等,可以依照函数lpush(从队列左边,也就是队首push一个数据),rpush(从队列右边也就是队尾push一个数据),lpop(同理),rpop等来控制。
      插入数据:
      面试总结
      显示数据:
      面试总结
      取出数据:
      面试总结
      阻塞版本
      上面的命令都是立即返回的,无论是否有数据。取数据有lpop有两个增强版本,blpop(block left pop)阻塞版本。
      使用方法:blpop key1 key2 …keyn 10
      同时预获取多个key的值,并设置超时时间为10s,如果所有key,有些key有value有value就立即返回,如果所有key都没有value就阻塞10s返回

    2. 发布者订阅者模式
      概念:三个用户A,B,C同时都订阅了一个channel名字叫msg,然后发布者往msg的channel里发布了一个数据,那么A,B,C三个用户都收到该数据。
      注意:

         1.很明显,三个用户A,B,C需要阻塞。怎么收到的订阅数据呢,肯定是依靠注册在Redis里面的回调函数。
         2.发布的数据不会在Redis里复现,意思是发布了以后,A,B,C由于种种原因没有收到。

      总结:

         1.生产者消费者模式需要消费者主动去拉取数据,如果写成死循环并且阻塞模式,就和第二种模式差不多了。
         2.发布者订阅者模式并不存在某个key里面如果订阅者没收到则该数据就丢失了。

rabbitmq 相关

1.单发单收
2.工作队列Worker Queue
3.发布/订阅 Publish/Subscribe
4.路由Routing
5.Topic类型的exchange
6.rabbitmq部分封装代码及装备工作

微服务 相关

  • rpc和grpc的区别

  • 微服务的划分规则

  • 微服务通讯方式

框架 相关

gin 如何实现一个rpc服务流程

MySql 相关

优化

docker 相关

  • Dockerfile
    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

    TCP 相关

本作品采用《CC 协议》,转载必须注明作者和本文链接
walt-white-zhou
讨论数量: 3

这是我今天的面试总结,希望走过路过的朋友,能给我一下指点,谢谢

2年前 评论

channel可以保证线程安全,是因为底层也是加锁处理的。

2年前 评论
walt-white (楼主) 2年前

多少k的面试题

2年前 评论
walt-white (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!