面试总结 - golang

Golang
512
0
0
2022-04-10
标签   Golang面试

面试总结

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. 生产者消费者模式
  2. 普通版本
  3. 比如一个队列里面,生产者A push了一个数据进去, 消费者B pop了这个数据,那么这个队列依旧为空。所以是一对一的。至于是先进先出还是后进后出等,可以依照函数lpush(从队列左边,也就是队首push一个数据),rpush(从队列右边也就是队尾push一个数据),lpop(同理),rpop等来控制。
  4. 插入数据:
  5. 面试总结
  6. 显示数据:
  7. 面试总结
  8. 取出数据:
  9. 面试总结
  10. 阻塞版本
  11. 上面的命令都是立即返回的,无论是否有数据。取数据有lpop有两个增强版本,blpop(block left pop)阻塞版本。
  12. 使用方法:blpop key1 key2 …keyn 10
  13. 同时预获取多个key的值,并设置超时时间为10s,如果所有key,有些key有value有value就立即返回,如果所有key都没有value就阻塞10s返回
  14. 发布者订阅者模式
  15. 概念:三个用户A,B,C同时都订阅了一个channel名字叫msg,然后发布者往msg的channel里发布了一个数据,那么A,B,C三个用户都收到该数据。
  16. 注意:

1.很明显,三个用户A,B,C需要阻塞。怎么收到的订阅数据呢,肯定是依靠注册在Redis里面的回调函数。

2.发布的数据不会在Redis里复现,意思是发布了以后,A,B,C由于种种原因没有收到。

  1. 总结:

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 相关