Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 开发常用操作技巧--字符串

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

作者头像
微客鸟窝
发布于 2023-01-09 11:17:54
发布于 2023-01-09 11:17:54
45300
代码可运行
举报
文章被收录于专栏:Go语言指北Go语言指北
运行总次数:0
代码可运行

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

含中文字符串截取

  1. 字符串的长度

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

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

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
 hello world 
hello world
hello world

合并/分割字符串

  1. 合并 Go 中的 strings 包提供的 Join() 函数,可以合并字符串。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言字符串基础
1.字符串是由一串Unicode字符组成的序列,每个Unicode字符都占用一个或多个字节的存储空间。
周小末天天开心
2023/10/16
2020
Golang 分割字符串
在开发过程中,很多时候我们有分割字符串的需求,即把一个字符串按照某种分割符进行切割。
恋喵大鲤鱼
2023/03/08
3K0
Go 字符串操作
要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。
看、未来
2022/06/19
4060
Go 字符串操作
Go语言中的字符串
Go语言中的字符串也可以使用比较操作符 <, <=, ==, !=, >, >=。具体比较方法是将字符串转化成的字节数组中的字节逐一比较。
宅蓝三木
2024/10/09
1020
【转】Go语言---strings包(字符串操作)
字符串求长度 求子串 是否存在某个字符或者子串 子串出现的次数(字符串匹配) 字符串分割(切分)成[]string 字符串是否存在某个前缀或后缀 字符或者子串在字符串中首次出现的位置或最后一次出现的位置 通过某个字符串将[]string进行拼接 字符串重复次数 字符串中子串替换 大小写转换 ......................等等一些基本操作。 由于string类型可以看成是一种特殊的slice类型,因此获取长度可以用内置的函数len;同时支持 切片 操作,因此,子串获取很容易。
yiduwangkai
2019/09/17
1K0
Go语言编程中字符串切割方法小结
1.func Fields(s string) []string,这个函数的作用是按照1:n个空格来分割字符串最后返回的是 []string的切片 import ( "fmt" "strings" ) func main() { fmt.Println(strings.Fields("hello widuu golang")) //out [hello widuu golang] } 2.func FieldsFunc(s string, f func(rune) bool) []string一看
李海彬
2018/03/20
2.5K0
区块链开发之Go语言—字符串和字节
字符串与字节的关系 Go 代码使用 UTF-8 编码,字符串和字节之间的转换依据的是UTF-8编码。注意中文是3个字节对应一个中文的字符串。 下面将归类讲述负责操作字符串和字节的几个标准库 strings 包提供了很多操作字符串的简单函数,通常一般的字符串操作需求都可以在这个包中找到。 bytes 包提供了对应操作字节的函数。 strconv 包提供了基本数据类型和字符串之间的转换。这个包之所以存在,是因为在Go中,没有隐式类型转换。字符串类型和 int、float、bool 等类型之间的转换却没有这么简单
linxinzhe
2018/04/10
1.4K0
Go 字符串处理
因为字符串类型在Go中是不可改变的,因此每次操作实际都要新分配字符串,所以在字符串比较多的时候效率不高。
孤烟
2020/09/27
7880
Golang语言社区--标准库strings包讲解
大家好,我是Golang语言社区主编彬哥,本篇文章是给大家转载关于标准库strings包的知识。
李海彬
2018/03/13
2.2K0
Golang语言社区--标准库strings包讲解
Go字符串
字符串 字符集用来做什么 字符集是为每个字符分配一个唯一的ID 在同一个字符集内,字符的ID是唯一的,不同字符集ID可能是不同的 UTF-8是编码规则或者说是Unicode的一种实现 UTF-8将Unicode中的字符ID以某种方式进行编码 变长的编码规则: 1-4字节,具体规则: 0xxxx表示0~127代表ascii Go语言中的字符串内部实现编码是UTF-8的,默认是rune类型 字符串是什么? 定义字符串 双引号和反引号 golang中单引号,双引号代表的含义 var ch = 'a' 代表ut
Wyc
2023/02/27
3140
转--Go语言常用字符串处理方法实例汇总
package main import ( "fmt" "strings" //"unicode/utf8" ) func main() { fmt.Println("查找子串是否在指定的字符串中") fmt.Println(" Contains 函数的用法") fmt.Println(strings.Contains("seafood", "foo")) //true fmt.Println(strings.Contains("seafood", "
李海彬
2018/03/20
7720
【Go 基础篇】Go 语言字符串函数详解:处理字符串进阶
大家好!继续我们关于Go语言中字符串函数的探索。字符串是编程中常用的数据类型,而Go语言为我们提供了一系列实用的字符串函数,方便我们进行各种操作,如查找、截取、替换等。在上一篇博客的基础上,我们将继续介绍更多字符串函数的用法和示例。(*^_^*)💕💕💕💕
繁依Fanyi
2023/10/12
6890
【Go 基础篇】Go 语言字符串函数详解:处理字符串进阶
golang之旅--数据类型之字符串
背景 学习go已经有很长一段时间了,对于它的数据类型还没有更加深入的了解,这里做一下对数据类型的总结,第一篇是字符串的介绍。 golang中的字符串 func stringDemo() { str := "李阳" //len函数返回的是字节长度 fmt.Println(len(str)) //utf8的RuneCountInString判断的是ASCII长度 fmt.Println(utf8.RuneCountInString(str)) } 字符串
李海彬
2018/03/27
1.4K0
Go基础——字符串
字符串结构由两个信息组成:第一个是字符串指向的底层字节数组,第二个是字符串的字节的长度。字符串其实是一个结构体,因此字符串的赋值操作也就是reflect.StringHeader结构体的复制过程,并不会涉及底层字节数组的复制。在前面数组一节提到的[2]string字符串数组对应的底层结构和[2]reflect.StringHeader对应的底层结构是一样的,可以将字符串数组看作一个结构体数组。 我们可以看看字符串“Hello, world”本身对应的内存结构:
羊羽shine
2019/05/28
5420
【Go】标准库strings包
package main import ( "fmt" "strings" ) func main() { str1 := "helloRegan" str2 := "Regan" fmt.Println(strings.Contains(str1,str2)) fmt.Println(strings.ContainsAny(str1,str2)) fmt.Println(strings.ContainsRune(str1,'R')) fmt.Println(strings.Conta
Regan Yue
2021/09/16
2900
GO-字符串常用操作
package main import ( "fmt" "strconv" "strings" ) func main() { /*字符串基本操作--strings*/ str := "wangdy" //是否包含 fmt.Println(strings.Contains(str, "wang"), strings.Contains(str, "123")) //true false //获取字符串长度
李海彬
2018/03/27
6330
Go 语言字符串使用方式与技巧
关于 Go 语言字符串的使用,我们需要了解标准库 strconv 和标准库 strings 的使用方式,它们分别用于字符串类型转换和字符串操作。
frank.
2023/12/14
2460
Go 语言字符串使用方式与技巧
Golang语言之字符串操作
转义字符 verb 含义 %d 十进制整数 %x,%X 大小写方式显式十六进制整数 %o 八进制整数 %b 二进制整数 %f,%g,%e 浮点数 %t 布尔值 %c 字符 %s 字符串 %q 带双引号的字符串 %v 内置格式内容 %T 类型 %p 内存地址 %% 字符% \n 换行 \t 缩进 ---- 文章内容主要以代码注释讲解相关知识点,代码阅读时请注意注释内容。 字符串与数值相互转换 package main import ( "fmt" "strconv" ) func ma
frank.
2020/07/23
8500
第七章 字符串
字符串可以使用 双引号(" ")或者 反引号(` `)来创建。双引号用来创建可解析的字符串,但不能用来引用多行,这也是大多数字符串的定义方式。
宇宙之一粟
2020/10/26
2820
第七章 字符串
golang学习笔记——字符串操作
fmt.Println(strings.Contains(str, "hello"))
码缘
2021/03/04
7450
相关推荐
Go语言字符串基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验