你好,感谢分享面试经验。看起来这位面试官比较注重技术细节和深度,考察的范围也比较广泛。以下是我的回答: 1. GMP,有锁吗? GMP是GNU多精度库,是一个用于高精度计算的库。它是线程安全的,但是并没有提供锁机制,而是使用了一些其他的技术来保证线程安全,比如原子操作和临界区。 2. channel底层,啥时候阻塞 channel底层是使用mutex和条件变量来实现的。当channel为空或者已满时,读写操作会被阻塞。 3. map安全吗,有序吗,哪些能当key map是并发不安全的,需要使用锁来保证并发安全。map是无序的,遍历时的顺序是随机的。map的key必须是可比较的类型,比如int、string等。 4. sync.Map读取逻辑你自己设计 sync.Map的读取逻辑是先尝试从read map中读取,如果不存在则从dirty map中读取,如果还不存在则返回nil。我的设计思路是使用两个map,一个read map和一个dirty map,读取时先从read map中读取,如果不存在则从dirty map中读取,同时将读取到的值存入read map中,这样下次读取时就可以直接从read map中读取了。 5. 索引大杂烩 索引是数据库中用于提高查询效率的一种数据结构。幻读是指在一个事务中,由于其他事务的插入或删除操作,导致同样的查询语句返回不同的结果。解决方案可以使用锁或者MVCC机制。联合索引是指使用多个列作为索引的键值,可以提高查询效率。索引下推是指在查询时,将过滤条件下推到索引层级,可以减少查询的数据量。Redis中的数据结构包括字符串、列表、集合、有序集合和哈希表。消息队列可以使用RabbitMQ、Kafka等实现,可以用于异步处理任务、解耦系统等。分布式锁可以使用Zookeeper、Redis等实现,可以用于控制分布式系统中的资源访问。限流可以使用令牌桶算法、漏桶算法等实现,可以用于控制系统的并发量。持久化可以使用数据库、文件等实现,可以用于保证数据的可靠性和持久性。 6. 为什么是三次握手?TIME_WAIT状态意义? 三次握手是为了建立可靠的连接,防止出现已失效的连接请求报文段被服务端接收并产生错误。TIME_WAIT状态是指在TCP连接关闭时,等待2MSL时间,以确保最后一个ACK报文段能够到达对端,防止出现已失效的连接请求报文段被服务端接收并产生错误。 7. 四次挥手可不可以是三次 四次挥手是为了保证数据传输的可靠性,防止出现数据丢失或重复。因此四次挥手是必要的,不能简化为三次。 8. 进程和线程区别,协程有什么好处 进程是操作系统资源分配的基本单位,拥有独立的内存空间和系统资源。线程是进程中的执行单位,共享进程的内存空间和系统资源。协程是一种轻量级的线程,可以在同一个线程中实现多个协程的切换,减少线程切换的开销,提高程序的并发性和性能。 9. linux命令大杂烩 Linux命令包括文件操作命令、进程管理命令、网络命令、系统管理命令等。常用的命令包括ls、cd、mkdir、rm、cp、mv、ps、kill、top、ifconfig、ping、netstat、iptables、df、du等。