在Go中修剪空格:如何去除字符串中的多余字符

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

每个开发者都熟悉的问题

\n\n

想象一下:您正在编写日志解析器、处理来自表单的用户输入或准备API数据。字符串在开头和结尾带有多余的空格。如果不删除它们——就会出现bug、错误的比较、混乱的JSON以及浪费数小时的调试时间。这是一个经典问题,在Stack Overflow上已有数千次浏览。今天我们将用Go来快速、优雅且毫无意外地解决它。

\n\n

在本指南中,您将了解:

\n
    \n
  • 如何使用标准库strings修剪空格。
  • \n
  • TrimSpace与TrimLeft和TrimRight的区别。
  • \n
  • 如何为非常规空白字符编写自己的自定义函数。
  • \n
  • 如何避免Unicode和制表符带来的陷阱。
  • \n
\n\n

开始吧!

\n\n

快速入门:strings.TrimSpace

\n\n

从字符串两端删除空格最简单、最流行的方法是使用标准包strings中的strings.TrimSpace函数。它会删除Go认为是“空白”的所有字符:普通空格、制表符、换行符、回车符甚至垂直制表符。

\n\n

代码如下:

\n\n
package main\n\nimport (\n    "fmt"\n    "strings"\n)\n\nfunc main() {\n    raw := "   你好,世界!   \\n\\t"\n    cleaned := strings.TrimSpace(raw)\n    \n    fmt.Printf("原始字符串:%q\\n", raw)\n    fmt.Printf("清理后:%q\\n", cleaned)\n}\n
\n\n

输出:

\n
原始字符串:"   你好,世界!   \\n\\t"\n清理后:"你好,世界!"\n
\n\n

请注意:fmt.Printf中的%q会显示带有转义序列的字符串——这便于调试,可以看到隐藏的字符。

\n\n

何时使用:在90%的情况下这就足够了。如果您只需要“清理”字符串两端的垃圾字符——请使用TrimSpace。

\n\n

精细调整:TrimLeft和TrimRight

\n\n

有时只需要修剪左侧或右侧的空格。Go为此提供了strings.TrimLeft和strings.TrimRight。但有一个细节:它们默认不是针对“空白字符”工作,而是针对传入的字符集。

\n\n

示例:

\n\n
package main\n\nimport (\n    "fmt"\n    "strings"\n)\n\nfunc main() {\n    s := "   \\t\\n   Hello   "\n    \n    // 仅修剪左侧(空格、制表符、换行符)\n    left := strings.TrimLeft(s, " \\t\\n")\n    fmt.Printf("左侧:%q\\n", left)\n    \n    // 仅修剪右侧(仅空格)\n    right := strings.TrimRight(s, " ")\n    fmt.Printf("右侧:%q\\n", right)\n}\n
\n\n

输出:

\n
左侧:"Hello   "\n右侧:"   \\t\\n   Hello"\n
\n\n

重要:TrimLeft和TrimRight会删除第二个参数中的所有字符,直到遇到不在其中的字符。如果您只指定了空格" ",那么制表符\\t将保持不变。

\n\n

单侧的TrimSpace替代方案

\n\n

如果您需要仅修剪左侧或右侧的所有空白字符,但又懒得列出所有字符,可以编写一个简单的包装函数:

\n\n
func trimLeftSpace(s string) string {\n    return strings.TrimLeft(s, " \\t\\n\\r\\v\\f")\n}\n\nfunc trimRightSpace(s string) string {\n    return strings.TrimRight(s, " \\t\\n\\r\\v\\f")\n}\n
\n\n

或者,对于喜欢简洁的人来说,可以使用strings.TrimSpace配合一个小技巧:

\n\n
// 仅修剪左侧:先反转,然后TrimSpace,再反转回来\nfunc trimLeftSpace(s string) string {\n    runes := []rune(s)\n    for i, r := range runes {\n        if !unicode.IsSpace(r) {\n            return string(runes[i:])\n        }\n    }\n                

博客

书籍推荐