继续分享最新的面经。
今天分享的是训练营内部学员在杭州滴滴的一面面经详解,下面是整理好的问题:

回答:可以通过遍历字符串数组,逐个字符比较来寻找。以下是Go实现示例:
func longestCommonPrefix(strs []string) string {
if len(strs) == 0 {
return ""
}
prefix := strs[0]
for _, str := range strs[1:] {
for i := range prefix {
if i >= len(str) || prefix[i] != str[i] {
prefix = prefix[:i]
break
}
}
if prefix == "" {
break
}
}
return prefix
}
回答:MySQL有四个隔离级别,从低到高分别是读未提交、读已提交、可重复读、串行化。
回答:幻读是指同一事务中,两次执行相同查询语句,第二次查询返回了第一次没有的行(或缺少了第一次有的行)。例如事务A先查询满足条件的行,事务B插入满足该条件的新行,事务A再次查询就会出现“幻觉”。
回答:主要有主键索引、唯一索引、普通索引、复合索引、全文索引、空间索引。
回答:InnoDB索引底层是B+树。它是平衡多路搜索树,非叶子节点存索引键,叶子节点存完整数据(主键索引)或索引键+主键(二级索引);叶子节点间通过双向链表连接,便于范围查询;所有数据在叶子节点,非叶子节点起索引引导作用,减少IO次数,提升查询效率。
回答:
回答:
回答:由innodb_flush_log_at_trx_commit参数控制:
回答:组合索引即联合索引,由多个列组合创建,遵循最左前缀原则。如联合索引(a, b, c),查询条件含a、a AND b、a AND b AND c时索引生效,含b、c等时不生效(或部分生效)。合理设计可减少索引数量,提升多列查询效率。
回答:适用于分布式系统中多个服务(或实例)互斥访问共享资源的场景,如电商库存扣减(防止超卖)、分布式任务调度(同一任务仅一个实例执行)、缓存预热(避免多节点重复预热)、分布式幂等性控制(保证同一请求仅处理一次)。
回答:有RDB和AOF两种方式。
回答:
UNLINK命令异步删除大Key;业务层限制Key大小;定期用--bigkeys命令或工具扫描大Key并处理。回答:Go中数组和切片区别如下:
维度 | 数组 | 切片 |
|---|---|---|
长度 | 固定,定义时确定 | 动态,可扩容 |
内存结构 | 值类型,存储元素值,传参拷贝整个数组 | 引用类型,含指针、长度、容量,传参拷贝元数据 |
定义方式 | 需指定长度,如[5]int | 无需指定长度,如[]int,或make创建 |
扩容机制 | 无 | 长度超容量时扩容,新容量一般为原容量2倍(<1024时)或1.25倍(≥1024时) |
回答:可以比较,但需注意:若接口动态类型是不可比较的(如切片、映射、函数),比较时会panic。只有当两个接口动态类型和动态值都相等时,才相等。例如var a, b interface{} = "hi", "hi",a==b为true;若动态类型是[]int{1},则比较会panic。
回答:不是。多个goroutine同时读写同一切片会出现数据竞争、数据不一致问题。需通过同步机制保证安全,如sync.Mutex加锁、channel传递数据,或使用并发安全的第三方结构。
回答:可以。若channel中还有未接收数据,可正常获取;数据取完后,接收操作返回元素类型零值,且第二个返回值(布尔值)为false。但向关闭的channel发送数据会panic。例如ch := make(chan int, 2); ch <- 1; ch <- 2; close(ch); fmt.Println(<-ch, <-ch, <-ch, ok)输出1 2 0 false。