Golang字符串类型原理及其使用方法

 更新时间:2023年09月14日 10:06:01   作者:SWUST_Vector  
本文主要介绍了Golang字符串类型原理及其使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Go字符串是不可变的字节序列,按照 UTF-8 编码的 Unicode 码点。字符串的内部序列不可改变,这样设计主要是为了减少内存开支,字符串及其子串都可以使用相同的底层内存。

ASCII码、Unicode字符、UFT-8编码

ASCII码: 使用7位表示128个字符串(大小写英文字母、数字、各种标点及设备控制符)。
Unicode字符: 基本包括了世界上所有的文本字符,使用int32位的数据类型保存单个字符。Go中rune 数据类型就对应该类型。
UTF-8编码: 以字节为单位对Unicode码点做变长编码,兼容ASCII码,相当于是将不同字节大小的字符类型组装到一起,使编码更加紧凑。但是UTF-8编码的字符串不能按下表直接访问某一个字符,需要使用特殊的方式进行处理。

字符串数据类型的基本操作

1.字符串长度

len函数: len(str) 该函数能获取字符串所占的字节数,如果字符串是字母或者数字可以表示该字符串的字符个数,如果包含汉字等特殊字符则无法表示字符个数。此时需要使用utf8.RuneCountInString(str)函数

package main
import (
	"fmt"
	"unicode/utf8"
)
func main() {
	str1 := "abcd"
	str2 := "abc坎"
	fmt.Printf("len(str1) -> %d\n", len(str1))
	fmt.Printf("len(str2) -> %d\n", len(str2))
	fmt.Printf("字符数(str1) -> %d\n", utf8.RuneCountInString(str1))
	fmt.Printf("字符数(str2) -> %d\n", utf8.RuneCountInString(str2))
}
// 输出
// len(str1) -> 4
// len(str2) -> 6
// 字符数(str1) -> 4
// 字符数(str2) -> 4

2.字符串前缀后缀及子字符串问题

基于utf8的优势,许多字符串的操作无需解码,可以直接判断某个字符串是否为前缀、后缀或者子字符串(判断时采用逐字节比较的方法)

package main
import (
	"fmt"
	"strings"
)
func main() {
str := "abcd"
	s := "abcd"
	//前缀
	if len(s) <= len(str) && str[:len(s)] == s {
		fmt.Println("Is PreFix!")
	}
	//后缀
	if len(s) <= len(str) && str[len(str)-len(s):] == s {
		fmt.Println("Is SufFix!")
	}
	//子字符串
	if strings.Contains(str, s) {
		fmt.Println("Is Contanins!")
	}
}
// 输出
// Is PreFix!
// Is SufFix!
// Is Contanins!

3.字符串的遍历

range: 该方法遍历的是字符串的字符个数

package main
import (
	"fmt"
)
func main() {
	str := "abcd爱莲说"
	for i, v := range str {
		fmt.Printf("str[%d] is %c\n", i, v)
	}
}
// 输出
// str[0] is a
// str[1] is b
// str[2] is c
// str[3] is d
// str[4] is 爱
// str[7] is 莲
// str[10] is 说

4.字符串和字节slice的相互转换

利用 [ ]byte 数据类型实现对字符串的操作,使用[]byte先对字符进行编辑然后再将其转换成字符串类型。

//不可编辑
s := "abcdef"
//可编辑
b := []byte(s)
str = string(b)

byte.Buffer工具: 该工具作为可以不断写入新的字符等byte数据

func AddByte(str string) string {
	var buf bytes.Buffer
	for _, v := range str {
		//添加原字符
		buf.WriteRune(v)
		//插入空格
		buf.WriteString(" ")
	}
	return buf.String()
}

到此这篇关于Golang字符串类型原理及其使用方法的文章就介绍到这了,更多相关Golang字符串类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang交叉编译(跨平台编译)的使用

    Golang交叉编译(跨平台编译)的使用

    本文主要介绍了Golang交叉编译(跨平台编译)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go语言学习之new函数的用法详解

    Go语言学习之new函数的用法详解

    这篇文章主要为大家详细介绍了Go语言中new()函数的相关知识以及具体用法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-05-05
  • golang1.23版本之前 Timer Reset方法无法正确使用

    golang1.23版本之前 Timer Reset方法无法正确使用

    在Go 1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避免潜在的问题,然而,这在实际代码中难以实现,因为设置定时器状态和发送channel的操作并不是原子的,在某些情况下,这会导致timer在不应该触发时提前触发
    2025-01-01
  • Go处理包含多种引号的字符串的几种方法

    Go处理包含多种引号的字符串的几种方法

    在Go中,有几种方式可以处理包含多种引号的字符串,以确保代码的可读性和正确性,本文将给大家详细介绍了这几种处理方式,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-04-04
  • Go工具链之go tool cover使用方法和示例详解

    Go工具链之go tool cover使用方法和示例详解

    go tool cover是Go工具链中的一个命令,作用是分析测试用例的代码覆盖率,本文将对go tool cover 作用,使用方法和使用场景作一个简单的介绍,感兴趣的同学可以参考阅读一下
    2023-07-07
  • 如何用go-zero 实现中台系统

    如何用go-zero 实现中台系统

    这篇文章主要介绍了如何用go-zero 实现中台系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Go语言中的HTTP客户端从标准库到第三方库

    Go语言中的HTTP客户端从标准库到第三方库

    本文介绍了Go语言中的HTTP客户端开发,涵盖标准库和第三方库使用、最佳实践、高级功能、HTTP/2支持、安全考虑、性能优化等内容,通过本文,读者可以构建高效、可靠的HTTP客户端应用
    2026-05-05
  • Go语言滑动窗口最大值的实现示例

    Go语言滑动窗口最大值的实现示例

    本文主要介绍了Go语言滑动窗口最大值的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Golang语言中切片的长度和容量的概念和使用

    Golang语言中切片的长度和容量的概念和使用

    这篇文章主要介绍了Golang语言中切片的长度和容量的概念和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • go语言用八百行代码实现一个JSON解析器

    go语言用八百行代码实现一个JSON解析器

    这篇文章主要为大家介绍了go语言用八百行代码实现一个JSON解析器实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论