
在 go 中统计字符串行数需计算换行符 `\n` 的数量,并根据末尾是否以换行符结尾决定是否加 1,无内置函数直接返回行数。
Go 标准库未提供类似 strings.LineCount() 的内置函数,因此需手动实现。核心逻辑是:每遇到一个 \n 表示一行结束,但最后一行不一定以 \n 结尾。因此,正确做法是:
- 使用 strings.Count(s, "\n") 统计换行符个数;
- 若字符串不以 \n 结尾(即 !strings.HasSuffix(s, "\n")),说明存在一个无换行符结尾的“最后一行”,需额外加 1。
以下是推荐实现:
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("line 1\nline 2\nline 3")) // 输出: 3
fmt.Println(NumLines("single line")) // 输出: 1
fmt.Println(NumLines("a\nb\nc\n")) // 输出: 3(末尾有 \n,不额外加)
fmt.Println(NumLines("")) // 输出: 0(空字符串,无行)
}⚠️ 注意事项:
- 空字符串 "" 返回 0,符合语义(零行);
- 仅含 \n 的字符串(如 "\n")返回 1(因为 Count=1,且 HasSuffix=true,不加);
- 此方法仅识别 Unix 风格换行符 \n;若需兼容 Windows(\r\n)或旧 Mac(\r),应先规范化换行符(例如用 strings.ReplaceAll(s, "\r\n", "\n") 和 strings.ReplaceAll(..., "\r", "\n") 预处理);
- 对超大字符串,该方法时间复杂度为 O(n),空间复杂度为 O(1),效率可靠,无需逐字符遍历。
总结:虽无内置函数,但借助 strings.Count 与 strings.HasSuffix 组合,即可简洁、健壮、高效地实现行数统计。










