- 作者:老汪软件技巧
- 发表时间:2024-10-09 04:00
- 浏览量:
面试内容(一)开场面试官介绍岗位关于求职者基本情况(二)项目相关系统重构 - 数据迁移项目优化服务器项目数据抓取业务项目抖音微信小游戏归因业务项目(三)Go和MySQL
1. MySQL相关
1. MySQL中索引如何实现,为什么MySQL里不使用B树。
在MySQL中,索引的实现主要依赖于特定的数据结构,以提高数据检索的速度。其中最常见的索引类型是基于B+树(B+Tree)的数据结构。
MySQL中的索引实现
B+树索引:
B树索引:
为什么MySQL里不使用B树
尽管B树在理论上可以用来实现索引,但在MySQL中更倾向于使用B+树,主要原因包括:
磁盘I/O优化:
范围查询优化:
插入删除效率:
Go相关
2. 切片如何实现
一个切片实际上是一个包含三个字段的结构体:
底层结构:
type slice struct {
array uintptr // 指向底层数组的指针
len int // 切片的长度
cap int // 切片的容量
}
3. Go里并发读写map会出现问题,如何解决使用互斥锁(Mutex)
使用 sync.Mutex 或 sync.RWMutex 对 map 的读写操作进行同步控制。这种方法适用于读写操作都较频繁的场景,示例:
import (
"sync"
)
type SafeMap struct {
mu sync.Mutex
m map[string]int
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.Lock()
defer sm.mu.Unlock()
value, ok := sm.m[key]
return value, ok
}
使用 sync.Map:
Go 1.9 版本引入了 sync.Map,这是一个并发安全的 map 实现。sync.Map 适用于读多写少的场景,因为它在读取时不加锁,而在写入时才加锁,从而减少了锁的竞争,示例:
import (
"sync"
)
var sm sync.Map
func Set(key, value interface{}) {
sm.Store(key, value)
}
func Get(key interface{}) (interface{}, bool) {
return sm.Load(key)
}
使用通道(Channel):
通过通道协调对 map 的访问,确保同一时间只有一个goroutine可以读写 map。
4. Go里的sort排序如何实现
sort 包提供了多种排序功能,可以对不同类型的切片和自定义集合进行排序。sort 包的核心思想是通过实现 sort.Interface 接口来提供排序功能:
sort.Interface 是一个接口,定义了排序所需的三个方法:
Len() :返回要排序的元素个数。Less(i, j int) :如果第 i 个元素应该排在第 j 个元素之前,则返回 true。Swap(i, j int) :交换第 i 个元素和第 j 个元素的位置。
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
常见类型的排序:
sort 包提供了对常见类型的切片进行排序的便捷函数:
Ints :对 []int 类型的切片进行升序排序。Float64s :对 []float64 类型的切片进行升序排序。Strings :对 []string 类型的切片进行升序排序。5. 协程和线程的区别,线程开销大的原因,协程有上下文切换为何线程消耗更多CPU资源
协程和线程的区别
资源消耗:
调度方式:
上下文切换:
并发粒度:
线程开销大的原因
内存分配:
上下文切换:
调度开销:
同步机制:
协程消耗更少CPU资源的原因
上下文切换简单:
调度灵活:
内存管理高效:
同步机制简单:
(四)算法与反问算法手撕反问欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。