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

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

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

含中文字符串截取

  1. 字符串的长度

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

由于中文一个字是由多个字节组成,所以直接通过上面切片的方式获取可能会把一个中文字的编码截成两半,导致乱码。解决办法是先将其转为 []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个字符
}
复制代码

结果:

image.png

生成随机字符串

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
复制代码

合并/分割字符串

  1. 合并 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-!
}
复制代码
  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)

示例:

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_!"}


相关文章
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
5天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
6天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
16天前
|
JSON Go 数据格式
Go - httpclient 常用操作
Go - httpclient 常用操作
30 2
|
26天前
|
缓存 编译器 Go
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
37 3
|
4天前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
11天前
|
Go 开发者
Go1.22 新特性:Slices 变更 Concat、Delete、Insert 等函数,对开发挺有帮助!
Go1.22 新特性:Slices 变更 Concat、Delete、Insert 等函数,对开发挺有帮助!
|
1月前
|
算法 网络协议 Linux
|
2月前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
2月前
|
Go
【golang】Go 判断字符串是否包含指定字符
【golang】Go 判断字符串是否包含指定字符
32 1