Scala 下划线 `_` 的常见用法,一次看清它在不同语境里的含义
Scala 里的下划线 `_` 不是单一语法糖,而是贯穿变量初始化、函数转换、集合操作、模式匹配等多个场景的关键符号。本文按实际开发中最容易混淆的几类用法重组说明,保留原始示例代码,并补出每种写法背后的语义边界与使用时机。
Scala 里的下划线 `_` 不是单一语法糖,而是贯穿变量初始化、函数转换、集合操作、模式匹配等多个场景的关键符号。本文按实际开发中最容易混淆的几类用法重组说明,保留原始示例代码,并补出每种写法背后的语义边界与使用时机。

Go 里的 `copy()` 看起来简单,真正容易踩坑的却是切片长度、底层数组共享,以及多维切片只做浅复制这几件事。本文把 `copy()` 的返回值、边界行为和几类高频用法拆开讲清,帮助你判断什么时候直接复制就够,什么时候必须手动做深复制。

Go 1.16 引入的 `embed` 包,解决了 Go 程序分发时“二进制和静态资源分离”的老问题。本文从单文件、目录嵌入到 Web 服务和 CLI 场景,梳理它的常见用法,并说明体积、只读特性和路径管理这些实际开发里最容易踩到的边界。

很多人把 `recover()` 当成 Go 的通用兜底手段,但它并不能拦住所有运行时错误。以 `fatal error: concurrent map read and map write` 为例,这类问题属于 Go 运行时直接抛出的致命错误,不走 `panic/recover` 流程。理解这一区别,才能正确判断该靠异常恢复,还是该从并发设计上解决问题。

sync.WaitGroup 是 Go 并发里最常用的等待机制之一,核心只有 Add、Done、Wait 三个动作,但一旦调用时机或传参方式出错,就很容易卡死或触发 panic。本文按“能解决什么问题、怎么组合使用、哪些地方最容易踩坑”的顺序重写,方便你直接对应到项目场景判断是否该用它。

Go 的 switch 默认不会像 C、Java 那样自动穿透,这让 `fallthrough` 成了一个既实用又容易被误用的关键字。本文从默认行为、语法限制、典型场景到替代写法梳理它的真实用法,帮助你判断什么时候该用、什么时候该避开。

Go 并发里最常见的问题,不是怎么启动 goroutine,而是共享数据一旦被同时读写,结果为什么会变得不可靠。本文围绕 `sync.Mutex`、`sync.RWMutex` 和 `sync.WaitGroup` 的实际用法展开,说明它们分别解决什么问题、适合什么场景,以及选型时该看哪些信号。

Go 里的 nil 切片和空切片打印出来都像 `[]`,但它们在底层指针、`nil` 比较、内存分配和 JSON 序列化上的表现并不一样。本文从切片结构入手,用代码和常见业务场景把两者的差异讲清,并给出判断空值、接口返回和序列化转换时更稳妥的写法。

PHP 项目里的权限控制,最怕的是把判断逻辑写死在业务代码里:角色一变、需求一加,权限代码就会在多个模块里反复修改。PHP-Casbin 的价值,在于把模型和策略拆开,用统一方式覆盖 RBAC、ACL、ABAC、多租户和 API 权限,让权限系统从“到处补判断”变成“集中配规则”。

Go 里常见的“nil 接口不等于 nil”并不是语言反常,而是接口底层表示决定的结果。关键点在于:接口值同时保存类型信息和数据指针,只有两者都为 nil,接口本身才等于 nil。理解这一点后,错误返回、类型断言和反射判断这些常见场景就更容易避坑。

在 Go 里处理二进制数据时,大小端决定了多字节数值如何写入内存、文件或网络。本文结合 Go 标准库 `encoding/binary` 的常用接口,说明什么时候该用大端或小端、怎样在代码里完成转换,以及实际使用时最容易踩到的几个点。

`[...]int{}` 不是错误语法,而是 Go 中“由编译器推断数组长度”的写法。配合按索引初始化和 `rune` 字符常量后,这道看起来像 `map` 的题,结果其实是长度 `100`。文章会把三处容易混淆的点拆开解释清楚。 `[...]int{}` 在 Go 里并不是少见语法,但和按索引初始化、单引号字符放在一起时,很容易让人误判成 `map` 或直接怀疑会编译失败。
![Go 语言里的 `[...]int{}` 是什么?为什么这道题会输出 100](https://img.ipython.cn/uploads/20260825/17876042426a8cad12c1b64700308296.webp)