Go 语言字符串常见操作

简介: 1. 字节数组2. 头尾处理3. 位置索引4. 替换5. 统计次数6. 重复7. 大小写8. 去除字符9. 字符串切片处理10. 数值处理

1. 字节数组


字节与字符的区别


字节(Byte) 是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位

字符(Character) 是计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等

一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示

通俗点来说,人的语言就是字符,而字节是机器的语言


示例


package main
import "fmt"
func main() {
  var (
    str1 = "hello"
    str2 = "world"
  )
  str3 := str1 + " " + str2
  //字符串转换成字节数组
  tmp := []byte(str3)
  fmt.Printf("数据: %s,长度: %d,数据类型: %T\n", str3, len(str3), str3)
  fmt.Println("字节数组:", tmp)
  fmt.Printf("数据: %s,长度: %d,数据类型: %T\n", tmp, len(tmp), tmp)
  //字节数组转字符串
  fmt.Println("字节数组转字符串:", string(tmp))
  //反转函数调用
  fmt.Println("反转: ", Reverse(str3))
}
//反转函数
func Reverse(str string) string {
  var (
    result string
    leng   int = len(str)
  )
  for i := 0; i < leng; i++ {
    //sprintf转换数据类型为string,使用+进行拼接
    result = result + fmt.Sprintf("%c", str[leng-i-1])
  }
  return result
}
//输出结果如下
数据: hello world,长度: 11,数据类型: string
字节数组: [104 101 108 108 111 32 119 111 114 108 100]
数据: hello world,长度: 11,数据类型: []uint8
字节数组转字符串: hello world
反转:  dlrow olleh


Sprintf的作用


package main
import "fmt"
func main() {
  var a = 88
  fmt.Printf("a的数值: %d , 类型: %T\n", a, a)
  b := fmt.Sprintf("%d", a)
  fmt.Printf("b的数值: %s , 类型: %T\n", b, b)
}
//输出结果如下
a的数值: 88 , 类型: int
b的数值: 88 , 类型: string


2. 头尾处理


prefix()函数判断前缀

suffix()函数判断后缀

使用prefix函数判断URL是否是以http://为开头,如果不是,则加上http://

使用suffix函数判断路径是否以/结尾,如果不是,则加上/为结尾

package main
import (
  "fmt"
  "strings"
)
func main() {
  var (
    url  string
    path string
  )
  fmt.Println("请输入URL和路径:")
  fmt.Scanf("%s%s", &url, &path)
  fmt.Printf("URL: %s\n", urlProcess(url))
  fmt.Printf("路径: %s", pathProcess(path))
}
//字符串头部处理
func urlProcess(url string) string {
  //判断是否以http://开头,返回布尔类型赋予result
  result := strings.HasPrefix(url, "http://")
  if !result {
    url = fmt.Sprintf("http://%s", url)
  }
  return url
}
//字符串尾部处理
func pathProcess(path string) string {
  //判断是否以/结尾,返回布尔类型赋予result
  result := strings.HasSuffix(path, "/")
  if !result {
    path = fmt.Sprintf("%s/", path)
  }
  return path
}


终端输入如下:
PS D:\goproject\src\test\main> go run .\main.go
请输入URL和路径:
www.google.com /opt/conf/k8s
URL: http://www.google.com
路径: /opt/conf/k8s/


3. 位置索引


Index()函数 判断出现在前面的位置

LastIndex()函数判断出现在末尾的位置

判断子字符串在字符串中首次出现的位置和在末尾出现的位置

package main
import (
  "fmt"
  "strings"
)
func main() {
  var (
    a   = "abbaabcddccd"
    str = "cd"
  )
  //判断str在a中首次出现的位置
  head := strings.Index(a, str)
  tail := strings.LastIndex(a, str)
  fmt.Printf("首次出现的位置:%d\n最后出现的位置:%d\n", head, tail)
}
//输出结果如下
首次出现的位置:6
最后出现的位置:10


4. 替换


Replace()函数格式如下:Replace(原字符串,原字段,新字符串,新字段,替换次数)-1表示全部替换,0表示不替换
Replace()函数格式如下:Replace(原字符串,原字段,新字符串,新字段,替换次数)-1表示全部替换,0表示不替换Replace()函数格式如下:Replace(原字符串,原字段,新字符串,新字段,替换次数)-1表示全部替换,0表示不替换

package main
import (
  "fmt"
  "strings"
)
func main() {
  var (
    a = "abbaabcddccd"
  )
  //把cd替换成CD,-1表示全部替换,0表示不替换
  result := strings.Replace(a, "cd", "CD", -1)
  fmt.Printf("替换前: %v\n", a)
  fmt.Printf("全部替换后: %v\n", result)
  result1 := strings.Replace(a, "cd", "CD", 0)
  fmt.Printf("不进行替换: %v\n", result1)
}
//输出结果如下
替换前: abbaabcddccd
全部替换后: abbaabCDdcCD
不进行替换: abbaabcddccd


5. 统计次数


Count()函数 统计次数

package main
import (
  "fmt"
  "strings"
)
func main() {
  var a = "abbcddcedsca"
  count := strings.Count(a, "cd")
  fmt.Printf("count: %v\n", count)
}
//输出结果如下
count: 1

6. 重复


Repeat()函数 重复输出多次

package main
import (
  "fmt"
  "strings"
)
func main() {
  var a = "加油~"
  result := strings.Repeat(a, 3)
  fmt.Printf("result: %v\n", result)
}
//输出结果如下
result: 加油~加油~加油~


7. 大小写


ToUpper()函数 转换大写

ToLower()函数转换小写

package main
import (
  "fmt"
  "strings"
)
func main() {
  var a = "hello"
  //转换大写
  result1 := strings.ToUpper(a)
  fmt.Printf("大写: %v\n", result1)
  //把上面转换的大写给转成小写
  result2 := strings.ToLower(result1)
  fmt.Printf("小写: %v\n", result2)
}
//输出结果如下
大写: HELLO
小写: hello


8. 去除字符


TrimSpace()函数去除空白字符

TrimLeft()从左往右删除

TrimRight()从右往左删除


  • 去除首尾空白字符

package main
import (
  "fmt"
  "strings"
)
func main() {
  var a = " abc "
  fmt.Println("长度:", len(a))
  //去除首位空白的字符
  result1 := strings.TrimSpace(a)
  fmt.Println("去除首尾空白字符:", result1, "\n长度:", len(result1))
}
//输出结果如下
长度: 5
去除首尾空白字符: abc 
长度: 3


  • 去除指定位置字符


package main
import (
  "fmt"
  "strings"
)
func main() {
  var a = "this is test web"
  //去掉字符串首尾部web字符
  result1 := strings.Trim(a, "web")
  fmt.Println("尾部去除:", result1)
  //从左往右删除所有指定的字符,直到遇到不包含在指定的字符为止
  result2 := strings.TrimLeft(a, "this")
  //空格也需匹配删除,直到没有指定的字符可以匹配为止
  result3 := strings.TrimLeft(a, "this ")
  //从右往左删除所有指定的字符,直到遇到不包含在内的字符为止
  result4 := strings.TrimRight(a, "web")
  fmt.Println("从左往右删除:", result2)
  fmt.Println("从左往右删除,有空格:", result3)
  fmt.Println("从右往左删除:", result4)
}
//输出结果如下
尾部去除: this is test 
从左往右删除:  is test web
从左往右删除,有空格: est web
从右往左删除: this is test


9. 字符串切片处理


Fields()函数

Split()函数

  • 默认识别空格进行切片处理
package main
import (
  "fmt"
  "strings"
)
func main() {
  var str string = "abc def ghi"
  //Fields函数默认识别的符号是空格
  result1 := strings.Fields(str)
  fmt.Printf("数据类型: %T , 数据格式: %v\n", result1, result1)
  for i := 0; i < len(result1); i++ {
    fmt.Println(result1[i])
  }
}
//输出结果如下
数据类型: []string , 数据格式: [abc def ghi]
abc
def
ghi
  • 识别其他符号分隔成切片
package main
import (
  "fmt"
  "strings"
)
func main() {
  var str string = "abc,def,ghi"
  //识别逗号进行分隔切片
  result := strings.Split(str, ",")
  fmt.Printf("数据类型: %T , 数据格式: %v\n", result, result)
}
//输出结果如下
数据类型: []string , 数据格式: [abc def ghi]

推荐使用Split()函数进行分隔

因为fields()函数默认只能识别空格,不能识别其他符号,而Split()函数则均可以识别

把切片按指定分隔符进行转换成字符串

Join()函数

package main
import (
  "fmt"
  "strings"
)
func main() {
  //定义切片
  var slice = []string{"123", "456", "789"}
  fmt.Printf("切片: %v\n", slice)
  //切片转换成字符串
  result := strings.Join(slice, ":")
  fmt.Printf("数据结构: %v , 数据类型: %T", result, result)
}
//输出结果如下
切片: [123 456 789]
数据结构: 123:456:789 , 数据类型: string


10. 数值处理


  • 使用strconv.Itoa()函数将数值转换成字符串
package main
import (
  "fmt"
  "strconv"
)
func main() {
  var num int = 12345678
  fmt.Printf("初始数据类型: %T\n", num)
  fmt.Printf("初始值: %d\n", num)
  //转换成字符串
  result := strconv.Itoa(num)
  fmt.Printf("转换后数据类型: %T\n", result)
  fmt.Printf("转换后值为: %s", result)
}
//输出结果如下
初始数据类型: int
初始值: 12345678
转换后数据类型: string
转换后值为: 12345678
  • 使用Sprintf()函数将整数转换成字符串
package main
import (
  "fmt"
)
func main() {
  var num int = 12345678
  fmt.Printf("初始数据类型: %T\n", num)
  //使用Sprintf()转换成字符串,可以实现多类型的转换
  result := fmt.Sprintf("%d", num)
  fmt.Printf("转换后数据类型:%T\n", result)
}
//输出结果如下
初始数据类型: int
转换后数据类型:string
  • 使用strconv.Atoi()函数进行字符串转换整数
package main
import (
  "fmt"
  "strconv"
)
func main() {
  var str string = "12345678"
  //字符串转整数
  result, err := strconv.Atoi(str)
  //如果有转换过程中有错,就抛出错误,没有错就返回数据类型
  if err == nil {
    fmt.Printf("数据类型: %T\n", result)
  } else {
    fmt.Println(err)
  }
}
//输出结果
数据类型: int

dbd912879942446a98b218c697925c99.png


相关文章
|
1天前
|
安全 Go 调度
Go语言中的并发编程
Go语言自带了强大的并发编程能力,它的协程机制可以让程序轻松地实现高并发。本文将从并发编程的基础概念出发,介绍Go语言中的协程机制、通道和锁等相关知识点,帮助读者更好地理解并发编程在Go语言中的实践应用。
|
3天前
|
Ubuntu Unix Linux
【GO基础】1. Go语言环境搭建
【GO基础】1. Go语言环境搭建
|
4天前
|
JSON 前端开发 Go
lucky - go 语言实现的快速开发平台
go 语言实现的快速开发平台,自动生成crud代码,前端页面通过json配置,无需编写前端代码。
10 0
|
5天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
14 2
|
5天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
5天前
|
算法 Go 分布式数据库
构建高可用的分布式数据库集群:使用Go语言与Raft共识算法
随着数据量的爆炸式增长,单一数据库服务器已难以满足高可用性和可扩展性的需求。在本文中,我们将探讨如何使用Go语言结合Raft共识算法来构建一个高可用的分布式数据库集群。我们不仅会介绍Raft算法的基本原理,还会详细阐述如何利用Go语言的并发特性和网络编程能力来实现这一目标。此外,我们还将分析构建过程中可能遇到的挑战和解决方案,为读者提供一个完整的实践指南。
|
5天前
|
消息中间件 Go API
基于Go语言的微服务架构实践
随着云计算和容器化技术的兴起,微服务架构成为了现代软件开发的主流趋势。Go语言,以其高效的性能、简洁的语法和强大的并发处理能力,成为了构建微服务应用的理想选择。本文将探讨基于Go语言的微服务架构实践,包括微服务的设计原则、服务间的通信机制、以及Go语言在微服务架构中的优势和应用案例。
|
5天前
|
安全 测试技术 数据库连接
使用Go语言进行并发编程
【5月更文挑战第15天】Go语言以其简洁语法和强大的并发原语(goroutines、channels)成为并发编程的理想选择。Goroutines是轻量级线程,由Go运行时管理。Channels作为goroutine间的通信机制,确保安全的数据交换。在编写并发程序时,应遵循如通过通信共享内存、使用`sync`包同步、避免全局变量等最佳实践。理解并发与并行的区别,有效管理goroutine生命周期,并编写测试用例以确保代码的正确性,都是成功进行Go语言并发编程的关键。
|
5天前
|
数据采集 监控 Java
Go语言并发编程:Goroutines和Channels的详细指南
Go语言并发编程:Goroutines和Channels的详细指南
12 3
|
5天前
|
数据采集 人工智能 搜索推荐
快速入门:利用Go语言下载Amazon商品信息的步骤详解
本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
快速入门:利用Go语言下载Amazon商品信息的步骤详解