【发布时间】:2026-01-02 12:25:02
【问题描述】:
在Go中修剪字符串变量的前导和尾随空格的有效方法是什么?
【问题讨论】:
-
在线文档准确描述了正在发生的事情,并提供了可运行和可编辑的示例!
-
希望这个可以被“Ruby strip golang”搜索到
标签: go
在Go中修剪字符串变量的前导和尾随空格的有效方法是什么?
【问题讨论】:
标签: go
例如,
package main
import (
"fmt"
"strings"
)
func main() {
s := "\t Hello, World\n "
fmt.Printf("%d %q\n", len(s), s)
t := strings.TrimSpace(s)
fmt.Printf("%d %q\n", len(t), t)
}
输出:
16 "\t Hello, World\n "
12 "Hello, World"
【讨论】:
go 中有很多函数可以修剪字符串。
在那里看到他们:Trim
这是一个示例,改编自文档,删除了前导和尾随空格:
fmt.Printf("[%q]", strings.Trim(" Achtung ", " "))
【讨论】:
fmt.Printf("%q", strings.Trim("\t\t\t\t", `! \t`)) 不工作
strings.TrimSpace(str)吗?
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.TrimSpace(" \t\n Hello, Gophers \n\t\r\n"))
}
输出: 你好,地鼠
【讨论】:
为了修剪你的字符串,Go 的“字符串”包有 TrimSpace()、Trim() 修剪前导和尾随空格的函数。
查看documentation 了解更多信息。
【讨论】:
正如@Kabeer 所提到的,您可以使用 TrimSpace,这是 golang 文档中的一个示例:
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.TrimSpace(" \t\n Hello, Gophers \n\t\r\n"))
}
【讨论】:
@peterSO 有正确答案。我在这里添加更多示例:
package main
import (
"fmt"
strings "strings"
)
func main() {
test := "\t pdftk 2.0.2 \n"
result := strings.TrimSpace(test)
fmt.Printf("Length of %q is %d\n", test, len(test))
fmt.Printf("Length of %q is %d\n\n", result, len(result))
test = "\n\r pdftk 2.0.2 \n\r"
result = strings.TrimSpace(test)
fmt.Printf("Length of %q is %d\n", test, len(test))
fmt.Printf("Length of %q is %d\n\n", result, len(result))
test = "\n\r\n\r pdftk 2.0.2 \n\r\n\r"
result = strings.TrimSpace(test)
fmt.Printf("Length of %q is %d\n", test, len(test))
fmt.Printf("Length of %q is %d\n\n", result, len(result))
test = "\r pdftk 2.0.2 \r"
result = strings.TrimSpace(test)
fmt.Printf("Length of %q is %d\n", test, len(test))
fmt.Printf("Length of %q is %d\n\n", result, len(result))
}
你也可以在Go lang playground 找到这个。
【讨论】:
带有 JSON Unmarshall 的快速字符串 "GOTCHA",它将为字符串添加换行引号。
(示例:{"first_name":" I have whitespace "} 的字符串值将转换为"\" I have whitespace \"")
在修剪任何内容之前,您需要先删除多余的引号:
// ScrubString is a string that might contain whitespace that needs scrubbing.
type ScrubString string
// UnmarshalJSON scrubs out whitespace from a valid json string, if any.
func (s *ScrubString) UnmarshalJSON(data []byte) error {
ns := string(data)
// Make sure we don't have a blank string of "\"\"".
if len(ns) > 2 && ns[0] != '"' && ns[len(ns)] != '"' {
*s = ""
return nil
}
// Remove the added wrapping quotes.
ns, err := strconv.Unquote(ns)
if err != nil {
return err
}
// We can now trim the whitespace.
*s = ScrubString(strings.TrimSpace(ns))
return nil
}
【讨论】:
我对性能感兴趣,所以我做了一个只修剪左边的比较 侧面:
package main
import (
"strings"
"testing"
)
var s = strings.Repeat("A", 63) + "B"
func BenchmarkTrimLeftFunc(b *testing.B) {
for n := 0; n < b.N; n++ {
_ = strings.TrimLeftFunc(s, func(r rune) bool {
return r == 'A'
})
}
}
func BenchmarkIndexFunc(b *testing.B) {
for n := 0; n < b.N; n++ {
i := strings.IndexFunc(s, func(r rune) bool {
return r != 'A'
})
_ = s[i]
}
}
func BenchmarkTrimLeft(b *testing.B) {
for n := 0; n < b.N; n++ {
_ = strings.TrimLeft(s, "A")
}
}
TrimLeftFunc 和 IndexFunc 相同,TrimLeft 更慢:
BenchmarkTrimLeftFunc-12 10325200 116.0 ns/op
BenchmarkIndexFunc-12 10344336 116.6 ns/op
BenchmarkTrimLeft-12 6485059 183.6 ns/op
【讨论】: