浅析一下 Go 的 Split

  • Post author:
  • Post category:其他


格式

strings.Split(s, sep)

// s: 被切割的字符串
// sep: 分隔符

return 字符串切片,如:[1,s2,d32,cv4512,v0001,s0d,vj]

示例 & 存在的情况

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "1,s2,d32,cv4512,v0001,s0d,vj"
	// sep存在字符串
	fmt.Print(strings.Split(s, ","))
	// sep不存在的情况
	fmt.Print(strings.Split(s, ""))
	//	s不存在的sep的情况
	fmt.Print(strings.Split(s, " "))
	//	只有一个的情况
	fmt.Print(strings.Split(s, "j"))
	// 参数都是空字符串
	fmt.Println(strings.Split("", ""))
}

// 执行如下
[1 s2 d32 cv4512 v0001 s0d vj]
[1 , s 2 , d 3 2 , c v 4 5 1 2 , v 0 0 0 1 , s 0 d , v j]
[1,s2,d32,cv4512,v0001,s0d,vj]
[1,s2,d32,cv4512,v0001,s0d,v ]
[]

在使用字符串切割时,会存在一下几种情况

  1. sep在被切割的字符串中存在
  2. 切割空字符串
  3. 切割字符串在被切割字符串中不存在
  4. 切割字符串只有一个
  5. 参数都是空字符串
func main() {
	s := "1,s2,d32,cv4512,v0001,s0d,vj"
	// sep存在字符串
	fmt.Println(strings.Split(s, ","))
	// sep不存在的情况
	fmt.Println(strings.Split(s, ""))
	//	s不存在的sep的情况
	fmt.Println(strings.Split(s, " "))
	// 参数都是空字符串
	fmt.Println(strings.Split("", ""))
	//	只有一个的情况
	fmt.Println(strings.Split(s, "j"))
}

源码

// s分割的字符串 sep分隔符 SepSave默认0 n默认-1
func genSplit(s, sep string, sepSave, n int) []string {
	if n == 0 {
		return nil
	}
    // 分隔符等于空字符串的情况
	if sep == "" {
		return explode(s, n)
        // explode具体源码就是将字符串以此将分隔符之前的数据全部拿出,然后再赋值给s
        // a[i] = s[:size]  s = s[size:]	
	}

	if n < 0 {
		n = Count(s, sep) + 1
	}

	a := make([]string, n)
	n--
	i := 0
	for i < n {
		m := Index(s, sep)
		if m < 0 {
			break
		}
		a[i] = s[:m+sepSave]
		s = s[m+len(sep):]
		i++
	}
	a[i] = s
	return a[:i+1]
}



版权声明:本文为dyfDewey原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。