Go 语言字符串及 strings 和 strconv 包

2024-06-01 17:12

本文主要是介绍Go 语言字符串及 strings 和 strconv 包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Go 语言编程中,字符串是最基本、最常用的数据类型之一。无论是处理用户输入、读取文件内容,还是生成输出,字符串操作无处不在。为了方便开发者对字符串进行各种操作,Go 语言提供了强大的 strings 包和 strconv 包。strings 包包含了一系列函数,用于处理和操作字符串,如查找、替换、分割、拼接等。strconv 包则专注于字符串与其他基本数据类型之间的转换,使得数据处理更加简洁高效。在这篇文章中,我们将深入探讨 Go 语言中的字符串处理方法,并详细介绍 strings 包和 strconv 包的主要功能和用法,帮助您更好地掌握字符串操作技巧,提高编程效率。


文章目录

      • 1、Go 语言中的字符串
        • 1.1、GO 语言
        • 1.2、字符串字面值
        • 1.3、字符串比较和操作
        • 1.4、字符串拼接
        • 1.5、字符串的其他操作
        • 1.6、示例:统计字节和字符
      • 2、strings 和 strconv 包
        • 2.1、strings 包
          • 2.1.1、前缀和后缀
          • 2.1.2、字符串包含关系
          • 2.1.3、判断子字符串或字符在父字符串中出现的位置(索引)
          • 2.1.4、字符串替换
          • 2.1.5、统计字符串出现次数
          • 2.1.6、重复字符串
          • 2.1.7、修改字符串大小写
          • 2.1.8、修剪字符串
          • 2.1.9、分割字符串
          • 2.1.10、拼接 slice 到字符串
          • 2.1.11、从字符串中读取内容
        • 2.2、strconv 包
          • 2.2.1、将其他类型转换为字符串
          • 2.2.2、将字符串转换为其他类型


1、Go 语言中的字符串

1.1、GO 语言

在 Go 语言中,字符串是 UTF-8 编码字符的序列。对于 ASCII 字符,每个字符占用 1 个字节,而其他字符根据需要占用 2 至 4 个字节。UTF-8 是一种广泛使用的编码格式,许多标准文本文件(如 XML 和 JSON)都采用这种编码。由于 UTF-8 编码的可变长度特性,Go 语言中的字符串也可能占用 1 到 4 个字节,这与 C++、Java 或 Python 不同(例如,Java 始终使用 2 个字节)。这种设计不仅减少了内存和硬盘空间的占用,还免去了对 UTF-8 文本进行编码和解码的繁琐操作。

字符串在 Go 中是一种值类型,且值不可变。这意味着一旦创建了字符串,就不能修改其内容。更深入地讲,字符串是字节的定长数组。

1.2、字符串字面值

Go 支持两种形式的字符串字面值:

解释字符串(Interpreted Strings):

  • 使用双引号括起来。
  • 转义字符会被替换,例如:\n 表示换行符,\t 表示制表符,\u\U 表示 Unicode 字符,\\ 表示反斜杠本身。

示例:

var str = "Hello, World!\n"

非解释字符串(Raw Strings):

  • 使用反引号括起来。
  • 支持多行字符串,转义字符不会被替换,所有内容都会原样输出。

示例:

var rawStr = `This is a raw string \n`

在 Go 中,字符串是通过长度来限定的,而不是像 C/C++ 那样通过特殊字符 \0 结束。string 类型的零值是长度为零的字符串,即空字符串 ""

1.3、字符串比较和操作

字符串可以通过常见的比较运算符(==!=<<=>=>)按字节在内存中进行比较。可以使用 len() 函数获取字符串的字节长度:

len("hello") // 5

字符串的内容(字节)可以通过索引访问,索引从 0 开始:

var str = "hello"
str[0] // 'h'
str[len(str)-1] // 'o'

需要注意的是,这种索引方式只对纯 ASCII 字符串有效。对于 Unicode 字符,需要使用 unicode/utf8 包提供的方法。

1.4、字符串拼接

字符串可以使用 + 运算符拼接:

var s1 = "hello"
var s2 = "world"
var s = s1 + " " + s2 // "hello world"

也可以使用 += 运算符进行拼接:

var s = "hello"
s += ", "
s += "world!" // "hello, world!"

在循环中使用 + 进行字符串拼接并不是最高效的方法。更好的方法是使用 strings.Join() 函数,或者使用 bytes.Buffer 进行高效的字符串拼接。

1.5、字符串的其他操作

在 Go 语言中,可以将字符串视为字节(byte)的切片(slice),从而实现标准索引操作。使用 for 循环可以根据索引返回字符串中的字节。而使用 for-range 循环可以对 Unicode 字符串进行迭代操作。

此外,Go 语言提供了丰富的字符串操作函数和方法,可以在标准库的 stringsunicode/utf8 包中找到。例如,可以使用 fmt.Sprint(x) 来格式化生成并返回字符串。

1.6、示例:统计字节和字符

创建一个程序用于统计字符串中的字节和字符数量。例如,分析字符串 "asSASA ddd dsjkdsjs dk""asSASA ddd dsjkdsjsこん dk",并解释两者不同的原因(提示:使用 unicode/utf8 包)。

示例代码:

package mainimport ("fmt""unicode/utf8"
)func main() {str1 := "asSASA ddd dsjkdsjs dk"str2 := "asSASA ddd dsjkdsjsこん dk"fmt.Printf("String: %s\n", str1)fmt.Printf("Bytes: %d, Runes: %d\n", len(str1), utf8.RuneCountInString(str1))fmt.Printf("String: %s\n", str2)fmt.Printf("Bytes: %d, Runes: %d\n", len(str2), utf8.RuneCountInString(str2))
}

该程序统计并输出字符串的字节数和字符(rune)数,从而展示 UTF-8 编码在处理不同字符时的差异。


2、strings 和 strconv 包

在 Go 语言中,字符串作为一种基本数据结构,有许多预定义的处理函数。strings 包用于对字符串进行主要操作,而 strconv 包用于字符串与其他类型之间的转换。

2.1、strings 包

strings 包提供了丰富的字符串操作函数,以下是一些常用操作:

2.1.1、前缀和后缀
  • strings.HasPrefix(s, prefix string) bool:判断字符串 s 是否以 prefix 开头。
  • strings.HasSuffix(s, suffix string) bool:判断字符串 s 是否以 suffix 结尾。

示例:

package mainimport ("fmt""strings"
)func main() {str := "This is an example of a string"fmt.Printf("T/F? Does the string \"%s\" have prefix %s? ", str, "Th")fmt.Printf("%t\n", strings.HasPrefix(str, "Th"))
}

输出:

T/F? Does the string "This is an example of a string" have prefix Th? true
2.1.2、字符串包含关系
  • strings.Contains(s, substr string) bool:判断字符串 s 是否包含子字符串 substr
2.1.3、判断子字符串或字符在父字符串中出现的位置(索引)
  • strings.Index(s, str string) int:返回子字符串 str 在字符串 s 中的第一个出现位置的索引,-1 表示不包含。
  • strings.LastIndex(s, str string) int:返回子字符串 str 在字符串 s 中最后一次出现位置的索引,-1 表示不包含。
  • strings.IndexRune(s string, r rune) int:返回字符 r 在字符串 s 中的索引。

示例:

package mainimport ("fmt""strings"
)func main() {str := "Hi, I'm Marc, Hi."fmt.Printf("The position of \"Marc\" is: %d\n", strings.Index(str, "Marc"))fmt.Printf("The position of the first instance of \"Hi\" is: %d\n", strings.Index(str, "Hi"))fmt.Printf("The position of the last instance of \"Hi\" is: %d\n", strings.LastIndex(str, "Hi"))fmt.Printf("The position of \"Burger\" is: %d\n", strings.Index(str, "Burger"))
}

输出:

The position of "Marc" is: 8
The position of the first instance of "Hi" is: 0
The position of the last instance of "Hi" is: 14
The position of "Burger" is: -1
2.1.4、字符串替换
  • strings.Replace(str, old, new string, n int) string:将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串。如果 n = -1,则替换所有字符串 old
2.1.5、统计字符串出现次数
  • strings.Count(s, str string) int:计算字符串 str 在字符串 s 中出现的非重叠次数。

示例:

package mainimport ("fmt""strings"
)func main() {str := "Hello, how is it going, Hugo?"manyG := "gggggggggg"fmt.Printf("Number of H's in %s is: %d\n", str, strings.Count(str, "H"))fmt.Printf("Number of double g's in %s is: %d\n", manyG, strings.Count(manyG, "gg"))
}

输出:

Number of H's in Hello, how is it going, Hugo? is: 2
Number of double g’s in gggggggggg is: 5
2.1.6、重复字符串
  • strings.Repeat(s, count int) string:返回一个新的字符串,该字符串由 count 次重复字符串 s 组成。

示例:

package mainimport ("fmt""strings"
)func main() {origS := "Hi there! "newS := strings.Repeat(origS, 3)fmt.Printf("The new repeated string is: %s\n", newS)
}

输出:

The new repeated string is: Hi there! Hi there! Hi there!
2.1.7、修改字符串大小写
  • strings.ToLower(s) string:将字符串 s 中的所有 Unicode 字符转换为小写。
  • strings.ToUpper(s) string:将字符串 s 中的所有 Unicode 字符转换为大写。

示例:

package mainimport ("fmt""strings"
)func main() {orig := "Hey, how are you George?"fmt.Printf("The original string is: %s\n", orig)fmt.Printf("The lowercase string is: %s\n", strings.ToLower(orig))fmt.Printf("The uppercase string is: %s\n", strings.ToUpper(orig))
}

输出:

The original string is: Hey, how are you George?
The lowercase string is: hey, how are you george?
The uppercase string is: HEY, HOW ARE YOU GEORGE?
2.1.8、修剪字符串
  • strings.TrimSpace(s):剔除字符串开头和结尾的空白符号。
  • strings.Trim(s, cutset):剔除字符串开头和结尾的指定字符 cutset
  • strings.TrimLeft(s, cutset):剔除字符串开头的指定字符 cutset
  • strings.TrimRight(s, cutset):剔除字符串结尾的指定字符 cutset
2.1.9、分割字符串
  • strings.Fields(s):根据空白符分割字符串,返回一个字符串切片。
  • strings.Split(s, sep):根据指定的分隔符 sep 分割字符串,返回一个字符串切片。

示例:

package mainimport ("fmt""strings"
)func main() {str := "The quick brown fox jumps over the lazy dog"sl := strings.Fields(str)fmt.Printf("Splitted in slice: %v\n", sl)for _, val := range sl {fmt.Printf("%s - ", val)}fmt.Println()str2 := "GO1|The ABC of Go|25"sl2 := strings.Split(str2, "|")fmt.Printf("Splitted in slice: %v\n", sl2)for _, val := range sl2 {fmt.Printf("%s - ", val)}fmt.Println()str3 := strings.Join(sl2, ";")fmt.Printf("sl2 joined by ;: %s\n", str3)
}

输出:

Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25
2.1.10、拼接 slice 到字符串
  • strings.Join(sl []string, sep string) string:将元素类型为 string 的 slice 使用分割符 sep 拼接成一个字符串。
2.1.11、从字符串中读取内容
  • strings.NewReader(str):生成一个 Reader 并读取字符串中的内容,然后返回指向该 Reader 的指针。

示例:

package mainimport ("fmt""strings"
)func main() {str := "The quick brown fox jumps over the lazy dog"sl := strings.Fields(str)fmt.Printf("Splitted in slice: %v\n", sl)for _, val := range sl {fmt.Printf("%s - ", val)}fmt.Println()str2 := "GO1|The ABC of Go|25"sl2 := strings.Split(str2, "|")fmt.Printf("Splitted in slice: %v\n", sl2)for _, val := range sl2 {fmt.Printf("%s - ", val)}fmt.Println()str3 := strings.Join(sl2,";")fmt.Printf("sl2 joined by ;: %s\n", str3)
}

输出:

Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25

更多字符串操作的文档请参阅官方文档。

2.2、strconv 包

strconv 包用于字符串与其他基本数据类型之间的转换。

2.2.1、将其他类型转换为字符串
  • strconv.Itoa(i int) string:将整数转换为字符串。
  • strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string:将浮点数转换为字符串,fmt 表示格式,prec 表示精度,bitSize 用于区分 float32float64

示例:

package mainimport ("fmt""strconv"
)func main() {var i int =123var f float64 = 3.14159s1 := strconv.Itoa(i)s2 := strconv.FormatFloat(f, 'f', -1, 64)fmt.Printf("Integer to string: %s\n", s1)fmt.Printf("Float to string: %s\n", s2)
}

输出:

Integer to string: 123
Float to string: 3.14159
2.2.2、将字符串转换为其他类型
  • strconv.Atoi(s string) (int, error):将字符串转换为整数。
  • strconv.ParseFloat(s string, bitSize int) (float64, error):将字符串转换为浮点数。

示例:

package mainimport ("fmt""strconv"
)func main() {var str string = "666"var anInt intvar newStr stringanInt, _ = strconv.Atoi(str)fmt.Printf("The integer is: %d\n", anInt)anInt += 5newStr = strconv.Itoa(anInt)fmt.Printf("The new string is: %s\n", newStr)
}

输出:

The integer is: 666
The new string is: 671

strconv 包中还包含了一些辅助变量,如 strconv.IntSize,用于获取当前平台下 int 类型的大小(位数)。

通过 stringsstrconv 包的强大功能,Go 语言提供了丰富的字符串处理和转换工具,使得开发者能够高效地处理和转换字符串数据。

这篇关于Go 语言字符串及 strings 和 strconv 包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021614

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换