前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 开发常用操作技巧--字符串

Go 开发常用操作技巧--字符串

作者头像
微客鸟窝
发布2023-01-09 19:17:54
3910
发布2023-01-09 19:17:54
举报
文章被收录于专栏:Go语言指北Go语言指北

Go 语言字符串的字节使用的是UTF-8编码,是一种变长的编码方式。使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

含中文字符串截取

  1. 字符串的长度

我们可以使用 len()函数来获取字符串的长度,英文为1个字节长度,中文为3个字节长度。可以使用 变量[n]的方式来获取第 n+1 个字节,返回的是对应的 Unicode 值。其中 n 的范围是 [0,len(n)-1]。

由于中文一个字是由多个字节组成,所以直接通过上面切片的方式获取可能会把一个中文字的编码截成两半,导致乱码。解决办法是先将其转为 []rune 类型,然后截取,再转为字符串类型。

示例:

代码语言:javascript
复制
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 包可以生成整型与浮点型伪随机数。

简单示例:

代码语言:javascript
复制
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

示例:

代码语言:javascript
复制
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() 函数,可以将字符串转换成大/小写。

代码语言:javascript
复制
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() 函数,可以去除字符串的空格。

代码语言:javascript
复制
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)
}

结果:

代码语言:javascript
复制
 hello world 
hello world
hello world

合并/分割字符串

  1. 合并 Go 中的 strings 包提供的 Join() 函数,可以合并字符串。
代码语言:javascript
复制
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-!
}
  1. 分割

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)

示例:

代码语言:javascript
复制
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)
}

结果:

代码语言:javascript
复制
str:[]string{"Hello", "World", "!"}
str1:[]string{"Hello", "World_!"}
str2:[]string{"Hello_", "World_", "!"}
str3:[]string{"Hello_", "World_!"}

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 含中文字符串截取
  • 生成随机字符串
  • 大小写
  • 去除字符串首尾空格
  • 合并/分割字符串
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档