Go 语言字符串的字节使用的是UTF-8编码,是一种变长的编码方式。使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
含中文字符串截取- 字符串的长度
len()变量[n]
[]rune
示例:
package main import ( "fmt" "unicode/utf8" ) func main() { str := "go 语言测试字符串" fmt.Println(len(str)) //打印字节长度 fmt.Println(utf8.RuneCountInString(str)) //打印字符串长度 str1 := str[0:5] //获取字符串前6个字符 fmt.Println(str1) strRune := []rune(str) //字符串转为 []rune类型 fmt.Println(len(strRune)) //转后的长度 fmt.Println(string(strRune[0:5])) //获取字符串前6个字符 } 复制代码
结果:
生成随机字符串math/rand 包可以生成整型与浮点型伪随机数。
简单示例:
package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) // 取纳秒时间戳,可以保证每次的随机数种子都不同 fmt.Println(rand.Int()) fmt.Println(rand.Int31()) fmt.Println(rand.Intn(5)) } 复制代码
自定义生成Rand结构体,设置随机数种子,本质上与Rand提供好的结构体没有太大区别:
- func NewSource(seed int64) Source
- 使用给定的种子创建一个伪随机资源。
- func New(src Source) *Rand
- 返回一个使用src生产的随机数来生成其他各种分布的随机数值的*Rand
示例:
package main import ( "fmt" "math/rand" "time" ) func main() { randlen := 5 //设定随机串长度 str := "0123456789abcdefghijklmnopqrstuvwxyz" bytes := []byte(str) //转成数组 result := []byte{} r := rand.New(rand.NewSource(time.Now().UnixNano())) for i :=0;i < randlen;i++{ result = append(result,bytes[r.Intn(len(str))]) } fmt.Println(string(result)) } 复制代码大小写
Go 中的 strings 包提供的 ToUpper()/ToLower() 函数,可以将字符串转换成大/小写。
package main import ( "fmt" "strings" ) var orig = "How Are You" var lower string var upper string func main() { fmt.Printf("%s\n", orig) //How Are You lower = strings.ToLower(orig) fmt.Printf("%s\n", lower) //how are you upper = strings.ToUpper(orig) //HOW ARE YOU fmt.Printf("%s\n", upper) } 复制代码去除字符串首尾空格
Go 中的 strings 包提供的 TrimSpace() 函数,可以去除字符串的空格。
package main import ( "fmt" "strings" ) func main() { str := " hello world " str1 := strings.TrimSpace(str) str2 := strings.Trim(str," ") fmt.Println(str) fmt.Println(str1) fmt.Println(str2) } 复制代码
结果:
hello world hello world hello world 复制代码合并/分割字符串
- 合并 Go 中的 strings 包提供的 Join() 函数,可以合并字符串。
package main import ( "fmt" "strings" ) func main() { str := []string{"hello","world","!"} str1 := strings.Join(str,"") //第一个参数是字符串数组,第二个参数是分隔符 str2 := strings.Join(str,"-") //第一个参数是字符串数组,第二个参数是分隔符 fmt.Println(str1) // helloworld! fmt.Println(str2) // hello-world-! } 复制代码
- 分割
strings 包提供的 Split()、SplitN()、SplitAfter()、SplitAfterN() 四个函数处理正则分割字符串。
- Split:分隔符会被去掉,参数1为字符串,参数2为分隔符
- SplitN:分隔符会被去掉,参数1为字符串,参数2为分隔符,参数3为分割的片数(-1则不限制)
- SplitAfter:保存分割符,参数1为字符串,参数2为分隔符
- SplitAfterN:保存分割符,参数1为字符串,参数2为分隔符,参数3为分割的片数(-1则不限制)
Split(s,sep) 等价于 SplitN(s,sep,-1)
SplitAfter(s,sep) 等价于 SplitAfterN(s,sep,-1)
示例:
package main import ( "fmt" "strings" ) func main() { str := "Hello_World_!" res := strings.Split(str,"_") fmt.Printf("str:%#v\n",res) res1 := strings.SplitN(str,"_",2) fmt.Printf("str1:%#v\n",res1) res2 := strings.SplitAfter(str,"_") fmt.Printf("str2:%#v\n",res2) res3 := strings.SplitAfterN(str,"_",2) fmt.Printf("str3:%#v\n",res3) } 复制代码
结果:
str:[]string{"Hello", "World", "!"} str1:[]string{"Hello", "World_!"} str2:[]string{"Hello_", "World_", "!"} str3:[]string{"Hello_", "World_!"}