插件窝 干货文章 Go语言字符串分割后,空字符串情况下数组长度为何为1而非0?

Go语言字符串分割后,空字符串情况下数组长度为何为1而非0?

字符串 分割 strings 一个 199    来源:    2025-03-14

在Go语言中,当你使用strings.Split函数来分割一个字符串时,如果分割后的结果中包含空字符串,那么这些空字符串会被保留在返回的切片中。具体来说,如果你对一个空字符串进行分割,结果会是一个包含一个空字符串的切片,而不是一个空切片。

示例代码

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := ""
    parts := strings.Split(str, ",")
    fmt.Println(len(parts)) // 输出: 1
    fmt.Println(parts)       // 输出: [""]
}

解释

  • str 是一个空字符串 ""
  • 使用 strings.Split(str, ",") 对其进行分割,分割符是 ,
  • 由于 str 是空字符串,分割后的结果是一个包含一个空字符串的切片 [""]
  • 因此,len(parts) 返回 1,而不是 0

为什么长度为1而不是0?

这是因为 strings.Split 函数的设计是保留所有分割后的部分,包括空字符串。即使输入字符串是空的,分割后的结果也会包含一个空字符串。

如何避免这种情况?

如果你希望在分割后去除空字符串,可以使用 strings.FieldsFunc 或者手动过滤掉空字符串。

使用 strings.FieldsFunc

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := ""
    parts := strings.FieldsFunc(str, func(r rune) bool {
        return r == ','
    })
    fmt.Println(len(parts)) // 输出: 0
    fmt.Println(parts)       // 输出: []
}

手动过滤空字符串

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := ""
    parts := strings.Split(str, ",")
    var nonEmptyParts []string
    for _, part := range parts {
        if part != "" {
            nonEmptyParts = append(nonEmptyParts, part)
        }
    }
    fmt.Println(len(nonEmptyParts)) // 输出: 0
    fmt.Println(nonEmptyParts)       // 输出: []
}

通过这些方法,你可以避免在分割空字符串时得到一个包含空字符串的切片。