Rust/Go 语言惯用设计模式

共 20 题
#

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 与类型无关