strings包裏面的Split函數的坑

不管哪一種開發語言,Split函數都是常常用到。最近發現了strings包裏的Split函數有個坑,真是活久見。函數

package main

import "fmt"
import "strings"

func main() {
    str := ""
    v := strings.Split(str, "#")
    if len(v)%2 != 0 {
        fmt.Printf("v len is [%d]", len(v))
    }
}

指望得到結果應該是0,由於常常讀數據字段的時候會作是否是幾元組的判斷。實際輸出爲:code

v len is [1]

來看Split的實現開發

func genSplit(s, sep string, sepSave, n int) []string {
    if n == 0 {
        return nil
    }
    if sep == "" {
        return explode(s, n)
    }
    if n < 0 {
        n = Count(s, sep) + 1
    }
    c := sep[0]
    start := 0
    a := make([]string, n)
    na := 0
    for i := 0; i+len(sep) <= len(s) && na+1 < n; i++ {
        if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) {
            a[na] = s[start : i+sepSave]
            na++
            start = i + len(sep)
            i += len(sep) - 1
        }
    }
    a[na] = s[start:]
    return a[0 : na+1]
}

能夠看到最後的返回的slice最少也有一個值。細節要多注意啊,不能用固有觀念來看新東西。string

相關文章
相關標籤/搜索