
在 go 中统计字符串行数需计算换行符数量并判断末尾是否换行,无内置函数直接返回行数,推荐使用 `strings.count` 配合 `strings.hassuffix` 实现健壮计数。
Go 标准库未提供类似 Python 的 str.count('\n') + 1 或 str.splitlines() 这样的直接行数统计函数,因此需手动实现。核心逻辑是:行数 = 换行符(\n)出现次数 +(若字符串不以 \n 结尾则加 1)。这是因为每行末尾通常由 \n 分隔,但最后一行可能无结尾换行符。
以下是一个简洁、高效且边界安全的实现:
package main
import (
"fmt"
"strings"
)
func NumLines(s string) int {
n := strings.Count(s, "\n")
if !strings.HasSuffix(s, "\n") {
n++
}
return n
}
func main() {
// 测试用例覆盖常见场景
fmt.Println(NumLines("")) // 0(空字符串)
fmt.Println(NumLines("hello")) // 1(单行,无换行符)
fmt.Println(NumLines("a\nb")) // 2(两行,中间有换行)
fmt.Println(NumLines("x\ny\nz\n")) // 3(三行,末尾有换行)
}✅ 关键说明:
- strings.Count(s, "\n") 时间复杂度为 O(n),底层优化良好,适合大多数场景;
- strings.HasSuffix(s, "\n") 安全处理空字符串(返回 false),避免额外空行误判;
- 该方法天然支持 Windows (\r\n) 和 Unix (\n) 换行风格的混合输入——但仅按 \n 计数,符合 Go 字符串规范(\r\n 在 Go 中视为两个独立字符,若需跨平台兼容 \r\n,应先 Normalize);
- 若需严格按“逻辑行”分割(如忽略空行、跳过注释等),应改用 strings.Split(s, "\n") 后过滤,但性能略低。
⚠️ 注意:不要使用 len(strings.Split(s, "\n")) 替代——它会为末尾空行额外生成空字符串(例如 "a\nb\n" → ["a","b",""],长度为 3,结果正确但内存开销大;而 "a\nb" → ["a","b"],长度为 2,也正确),虽可行但不推荐用于纯计数场景。
总结:strings.Count + HasSuffix 组合是 Go 中统计行数的标准、轻量、可读性强的最佳实践。










