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


相关文章
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
210 4
|
4月前
|
人工智能 自然语言处理 算法
Go语言统计字符串中每个字符出现的次数 — 简易频率分析器
本案例实现一个字符统计程序,支持中文、英文及数字,可统计用户输入文本中各字符的出现次数,并以整洁格式输出。内容涵盖应用场景、知识点讲解、代码实现与拓展练习,适合学习文本分析及Go语言基础编程。
|
3月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
312 0
|
1月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
360 4
|
5月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
331 61
|
5月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
12月前
|
存储 Go 索引
go语言中遍历字符串
go语言中遍历字符串
212 5
|
6月前
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。
|
7月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
195 6
|
8月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
280 11