# 1. Go 的接口(隐式实现)如何促进小接口(io.Reader 等)组合 A Go 接口必须显式声明实现 B Go 接口隐式实现,鼓励小接口并通过嵌入组合 ✓ 正确答案 C 接口越大越好,包含很多方法 D 接口无法组合
# 2. context 如何在调用链中传递取消、超时与请求范围值 A context 只能传值,不能取消 B context 通过派生与 Done 传播取消/超时,用 WithValue 传请求范围值 ✓ 正确答案 C 子 context 取消不会影响父 context D context 不能设置超时
# 3. Go 并发原语选型中 channel、mutex 与 atomic 各自的适用场景,为什么不要通过共享内存通信并非万能 A mutex 用于协程间通信 B channel 适用所有并发场景 C 数据流用 channel,共享状态用 mutex,简单标量用 atomic ✓ 正确答案 D atomic 适用于复杂共享结构
# 4. Rust 的 Send/Sync 中所有权如何让数据竞争在编译期暴露,自定义类型何时需要手动实现这些 trait A 数据竞争在运行时检测 B Send 表示可跨线程移动,Sync 表示可跨线程共享引用,所有权模型让数据竞争在编译期暴露 ✓ 正确答案 C 所有类型都需手动实现 Send/Sync D Send 表示可共享引用
# 5. Go 中"接受接口返回结构体"的设计准则与可测试性 A 该准则与可测试性无关 B 返回接口更灵活,是推荐做法 C 参数用结构体,返回用接口 D 参数用接口解耦可 mock,返回结构体具体明确,提升可测试性 ✓ 正确答案
# 6. Result<T,E> 与 ? 操作符如何强制错误显式传播 A ? 会吞掉错误 B ? 在 Ok 解出值、在 Err 提前返回错误,强制错误显式传播 ✓ 正确答案 C Result 的错误可以被忽略 D ? 只能用于 panic
# 7. error 作为值(显式返回)与 errors.Is/As 的包装链 A errors.Is 用于类型断言 B error 是异常,自动抛出 C error 作为值显式返回,errors.Is 判断特定错误、errors.As 提取类型,%w 保持链 ✓ 正确答案 D %w 包装会丢失原错误
# 8. fan-in/fan-out 与 worker pool 在 Go 并发中的惯用实现 A worker pool 用无界 goroutine B fan-in 是分发任务 C fan-out 分发任务到多 goroutine,fan-in 用 WaitGroup 合并结果,worker pool 控制并发 ✓ 正确答案 D 结果 channel 无需关闭
# 9. sync.Pool 如何降低高频对象的 GC 压力 A sync.Pool 复用高频临时对象,减少分配与 GC 压力 ✓ 正确答案 B sync.Pool 保证对象长期存活 C 池内对象无需重置可直接用 D sync.Pool 增加分配次数
# 10. Go 结构体嵌入中 embedding 如何实现组合式复用,与方法提升、接口满足的关系 A 嵌入是继承 B 嵌入实现组合复用,方法提升让外层调用内层方法,接口自动满足 ✓ 正确答案 C 嵌入的方法不会提升 D 嵌入无法满足接口
# 11. Functional Options 中如何用可变长函数参数实现可扩展的构造配置,与 Builder 的差异 A 用可变长函数参数配置构造,可扩展、向后兼容 ✓ 正确答案 B 与 Builder 完全相同 C 新增配置需改构造器签名 D Functional Options 不支持默认值
# 12. Cell/RefCell 在单线程内部可变性(interior mutability)的用途 A Cell 用于非 Copy 类型 B Cell 用于 Copy 类型,RefCell 用于非 Copy 类型并运行时检查借用,都是单线程内部可变性 ✓ 正确答案 C RefCell 是跨线程安全的 D 内部可变性无需借用检查
# 13. trait 与 trait bound 如何替代传统接口与泛型约束 A trait 定义行为,trait bound 约束泛型,可组合、支持静态分派 ✓ 正确答案 B trait 是运行时接口,无静态分派 C trait bound 无法组合 D trait 只有虚方法
# 14. RAII(Drop trait)如何保证资源(文件/锁/内存)确定性释放 A 对象离开作用域时自动调用 Drop,资源确定性释放 ✓ 正确答案 B 资源释放依赖 GC C Drop 后资源仍可访问 D RAII 需要手动释放资源
# 15. Rc/Arc 与借用检查器的协作中共享所有权如何建模 A Rc 可跨线程使用 B Rc/Arc 共享所有权(引用计数),可变数据配合内部可变性,Arc 可跨线程 ✓ 正确答案 C Rc/Arc 数据默认可变 D Arc 是单线程引用计数
# 16. Rust 所有权/借用如何以编译期规则替代 GC 与裸指针 A 借用规则允许同时可变与不可变借用 B Rust 依赖 GC 回收内存 C 所有权 + 借用规则在编译期保证内存安全,替代 GC 与裸指针 ✓ 正确答案 D 所有权允许多个所有者
# 17. defer 在资源释放与锁解锁中的 RAII 式惯用法 A defer 按先进先出顺序执行 B defer 在注册时立即执行 C defer 在函数返回时自动释放资源/锁,保证任意路径释放 ✓ 正确答案 D defer 只用于日志
# 18. goroutine + channel 如何表达 CSP 并发而非共享内存 A channel 是共享内存 B goroutine 只能通过共享变量通信 C goroutine 通过 channel 传递数据,用通信代替共享内存 ✓ 正确答案 D CSP 模型不涉及 channel
# 19. Go 的空接口 interface{} 与类型断言/反射的取舍中什么时候应该用泛型替代,什么时候必须反射? A 反射总是优于泛型 B 泛型替代空接口做类型安全操作,反射用于运行时动态类型处理 ✓ 正确答案 C 泛型能处理运行时才知道的类型 D 空接口保留静态类型信息
# 20. Rust 的 typestate 模式中如何用类型状态机在编译期禁止非法操作序列,与运行时校验的对比 A typestate 有运行时开销 B 非法操作序列在运行时才能发现 C 用类型编码状态,方法限定在特定状态类型,编译期禁止非法操作序列 ✓ 正确答案 D typestate 与类型无关