Golang中strings.Trim的bug问题讨论

Golang中strings.Trim的bug问题讨论 我想请教大家,strings.Trim 函数返回的字符串是否符合我们的预期:

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Print(strings.Trim("ciao.com", ".com"))
}

它应该返回 “ciao”,还是我理解有误?如果你运行这段代码,会发现它返回的是 “ia”。

2 回复

抱歉,这不是一个bug 🙂 版主可以删除这个主题。在这种情况下,使用 TrimSuffix 更好。Trim 会从源字符串中删除所有的 “c”、“o” 和 “.com”。这就是它返回 “ia” 的原因。

func main() {
    fmt.Println("hello world")
}

更多关于Golang中strings.Trim的bug问题讨论的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


strings.Trim 函数的行为符合设计预期,但可能和你的理解有差异。该函数会从字符串两端连续移除包含在指定字符集合中的任意字符,而不是移除指定的后缀子串。

在你的例子中:

strings.Trim("ciao.com", ".com")

第二个参数 ".com" 是一个字符集合,包含四个字符:'.''c''o''m'。函数会从 "ciao.com" 两端开始,移除所有出现在这个集合中的字符,直到遇到不在集合中的字符为止。

处理过程:

  1. 从左端开始:'c' 在集合中,移除 → "iao.com"
  2. 继续左端:'i' 不在集合中,停止左端移除
  3. 从右端开始:'m' 在集合中,移除 → "iao.co"
  4. 继续右端:'o' 在集合中,移除 → "iao.c"
  5. 继续右端:'.' 在集合中,移除 → "iao"
  6. 继续右端:'o' 在集合中,移除 → "ia"
  7. 继续右端:'a' 不在集合中,停止右端移除

最终结果:"ia"

如果你需要移除后缀子串,应该使用 strings.TrimSuffix

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.TrimSuffix("ciao.com", ".com"))  // 输出: ciao
}

或者使用 strings.TrimRight 来移除右侧的特定字符集合:

fmt.Println(strings.TrimRight("ciao.com", ".com"))  // 输出: ciao

注意 strings.TrimRight 也是基于字符集合的,但在你的例子中恰好能正确工作,因为 ".com" 这些字符只出现在字符串末尾。

回到顶部