面试总结
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 相关
- 如何实现一个队列
- 生产者消费者模式
- 普通版本
- 比如一个队列里面,生产者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返回
- 发布者订阅者模式
- 概念:三个用户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 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。