Go字符串实战操作大全!

目录

    • 1. 引言
      • 文章结构概览
    • 2. Go字符串基础
      • 字符串的定义与特性
        • 什么是字符串?
        • Go字符串的不可变性原则
      • 字符串的数据结构
        • Go字符串的内部表达
        • `byte`和`rune`的简介
    • 3. 字符串操作与应用
      • 3.1 操作与应用
        • 字符串连接
        • 字符串切片
        • 字符串查找
        • 字符串比较
        • 字符串的替换
        • 字符串的大小写转换
        • 使用正则表达式处理字符串
        • 字符串的加密与哈希
        • 字符串拆分
        • 字符串合并
        • 获取字符串中的字符
        • 字符串中字符的遍历
        • 修剪字符串
        • 填充字符串
        • 字符串的统计
      • 3.2 使用标准库处理字符串
        • `strings`库概览
        • 其他有用的字符串库
    • 4. Go字符串字符编码
      • 什么是字符编码?
      • UTF-8 编码简介
      • Unicode码点与rune类型
      • 字符串与UTF-8互操作
        • 获取字符串长度
        • 将字符串解码为rune切片
      • 转换字符编码
    • 5. Go字符串类型转换
      • 字符串与整数
        • 整数转字符串
        • 字符串转整数
      • 字符串与浮点数
        • 浮点数转字符串
        • 字符串转浮点数
      • 字符串与字节切片
        • 字符串转字节切片
        • 字节切片转字符串
    • 6. 总结

在本篇文章中,我们深入探讨了Go语言中字符串的魅力和深度。从基础定义、操作、字符编码到复杂的类型转换,每个环节都带有实例和代码示例来深化理解。通过这些深入的解析,读者不仅能够掌握字符串在Go中的核心概念,还能洞察Go设计哲学背后的思考。

关注【TechLead】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

1. 引言

在现代编程中,字符串处理是不可或缺的一部分。无论是简单的用户界面,还是复杂的数据处理,字符串都扮演着关键的角色。Go语言,作为一个现代的、性能优越的编程语言,为字符串处理提供了一系列强大的工具和功能。

文章结构概览

为了帮助读者深入理解Go中的字符串,我们将在文章中讨论以下几个主题:

  • Go字符串的基本定义和特性。
  • 如何在Go中进行常见的字符串操作。
  • 字符编码,尤其是UTF-8在Go中的应用。
  • 如何进行字符串的各种类型转换。

通过本文的深入解析,您能对Go字符串有一个全面而深入的了解,并能在实际应用中得心应手。


2. Go字符串基础

file

字符串在编程领域中是至关重要的,无论您是在处理用户输入,还是从数据库中读取数据,都离不开字符串。Go语言为字符串处理提供了简洁且高效的工具。

字符串的定义与特性

什么是字符串?

定义: 在Go中,字符串是任意字节的集合,通常用于表示文本。字符串是不可变的,这意味着您不能修改字符串的某个字符,但可以生成一个新的字符串。

例子:

// 定义一个字符串
greeting := "Hello, Go!"
fmt.Println(greeting)  // 输出: Hello, Go!
Go字符串的不可变性原则

定义: 在Go中创建的每一个字符串都是不可变的。这意味着您不能直接修改字符串中的字符。这种设计可以为字符串操作带来一些性能优势,尤其是在字符串复制和传递时。

例子:

str := "GoLang"
// str[0] = 'g'  // 这会报错
newStr := "g" + str[1:]
fmt.Println(newStr)  // 输出: golang, 通过创建新的字符串来"修改"原字符串

字符串的数据结构

Go字符串的内部表达

定义: Go字符串背后是一个字节数组,这也意味着Go能够存储任何数据,不仅仅是UTF-8文本。

例子:

// 字符串和其对应的字节
str := "Hello"
for i := 0; i < len(str); i++ {fmt.Printf("%x ", str[i])  // 输出每个字符的十六进制表示
}
// 输出: 48 65 6c 6c 6f
byterune的简介

定义:

  • byteuint8的别名,通常用于处理ASCII字符。
  • runeint32的别名,用于处理一个UTF-8字符或Unicode码点。

例子:

// byte和ASCII字符
byteValue := byte('A')
fmt.Println(byteValue)  // 输出: 65// rune和UTF-8字符
runeValue := rune('你')
fmt.Printf("%#U \n", runeValue)  // 输出: U+4F60

3. 字符串操作与应用

处理字符串是日常编程任务的一部分,Go语言提供了一整套工具和标准库函数,使这些操作变得简单和高效。

3.1 操作与应用

字符串连接

定义: 在Go中,可以使用+运算符将两个或多个字符串连接起来。

例子:

// 字符串连接
str1 := "Hello"
str2 := "World"
result := str1 + ", " + str2
fmt.Println(result)  // 输出: Hello, World
字符串切片

定义: 由于Go字符串背后是字节切片,所以您可以像处理数组或切片那样处理字符串,获取字符串的子串。

例子:

// 字符串切片
str := "GoLang"
subStr := str[2:4]
fmt.Println(subStr)  // 输出: La
字符串查找

定义: 使用strings包中的函数,如ContainsIndex等,可以轻松查找子串或字符。

例子:

import "strings"str := "Hello, Go!"
found := strings.Contains(str, "Go")
fmt.Println(found)  // 输出: trueposition := strings.Index(str, "Go")
fmt.Println(position)  // 输出: 7
字符串比较

定义: Go提供了一种原生的方式来比较两个字符串是否相等。此外,strings库中的Compare函数可以用来确定两个字符串在字典序上的先后关系。

例子:

str1 := "apple"
str2 := "banana"// 使用==比较字符串
isEqual := str1 == str2
fmt.Println(isEqual)  // 输出: false// 使用strings.Compare比较字符串
compResult := strings.Compare(str1, str2)
fmt.Println(compResult)  // 输出: -1, 表示str1在str2之前
字符串的替换

定义: 使用strings包中的ReplaceReplaceAll函数,您可以在字符串中替换子串。

例子:

source := "go is good, go is great"
replaced := strings.ReplaceAll(source, "go", "Go")
fmt.Println(replaced)  // 输出: Go is good, Go is great
字符串的大小写转换

定义: strings库为大小写转换提供了ToUpperToLower函数。

例子:

str := "GoLang"
lowercase := strings.ToLower(str)
uppercase := strings.ToUpper(str)
fmt.Println(lowercase)  // 输出: golang
fmt.Println(uppercase)  // 输出: GOLANG
使用正则表达式处理字符串

定义: Go的regexp库提供了一系列函数来使用正则表达式进行字符串的查询、匹配、替换和切分。

例子:

import "regexp"str := "My email is example@example.com"
re := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}`)
email := re.FindString(str)
fmt.Println(email)  // 输出: example@example.com
字符串的加密与哈希

定义: Go的crypto包提供了多种加密算法,您可以使用它们来加密字符串或计算字符串的哈希。

例子:

import ("crypto/md5""fmt""io"
)str := "secret data"
hasher := md5.New()
io.WriteString(hasher, str)
fmt.Printf("%x\n", hasher.Sum(nil))  // 输出: md5哈希值
字符串拆分

定义: 使用strings.Split函数,可以按指定的分隔符将字符串拆分为子串的切片。

例子:

str := "apple,banana,cherry"
items := strings.Split(str, ",")
fmt.Println(items)  // 输出: [apple banana cherry]
字符串合并

定义: strings.Join函数能够将一个字符串切片合并为一个单独的字符串。

例子:

items := []string{"apple", "banana", "cherry"}
str := strings.Join(items, ", ")
fmt.Println(str)  // 输出: apple, banana, cherry
获取字符串中的字符

定义: 可以通过索引访问字符串中的每个字符,但返回的是字符的byte值。

例子:

str := "Go"
byteValue := str[1]
fmt.Println(byteValue)  // 输出: 111 (ASCII码的'o')
字符串中字符的遍历

定义: 使用for range循环可以迭代字符串中的每个字符。

例子:

str := "Go"
for index, char := range str {fmt.Printf("At index %d, char: %c\n", index, char)
}
修剪字符串

定义: strings.TrimSpace函数可以去除字符串首尾的空格。

例子:

str := "   Go Lang   "
trimmed := strings.TrimSpace(str)
fmt.Println(trimmed)  // 输出: Go Lang
填充字符串

定义: 使用fmt包,您可以使用特定的格式修饰符来填充或对齐字符串。

例子:

str := "Go"
padded := fmt.Sprintf("%-10s", str)
fmt.Println(padded)  // 输出: Go        
字符串的统计

定义: strings.Count函数可以帮助统计一个子串在字符串中出现的次数。

例子:

str := "Go is easy to learn. Go is powerful."
count := strings.Count(str, "Go")
fmt.Println(count)  // 输出: 2

3.2 使用标准库处理字符串

strings库概览

定义: strings库提供了一系列强大的函数,用于字符串的查询、替换、转换和切分等操作。

例子:

import "strings"str := "go is awesome"
title := strings.Title(str)
fmt.Println(title)  // 输出: Go Is Awesome
其他有用的字符串库
  • strconv库:用于字符串与其他基本数据类型之间的转换。

    例子:

    import "strconv"number := 12345
    strNum := strconv.Itoa(number)
    fmt.Println(strNum)  // 输出: "12345"
    
  • unicode库:用于检查字符属性,如是否为数字、字母等。

    例子:

    import "unicode"ch := 'A'
    isLetter := unicode.IsLetter(ch)
    fmt.Println(isLetter)  // 输出: true
    

4. Go字符串字符编码

字符串在计算机中是通过字符编码来存储和表示的。在Go中,字符串默认使用UTF-8编码,这意味着它可以轻松表示任何Unicode字符。

什么是字符编码?

定义: 字符编码是一套规则,用于将字符转换为计算机可以理解的数字代码。常见的字符编码包括ASCII、ISO-8859-1和UTF-8。

UTF-8 编码简介

定义: UTF-8是一种变长的Unicode字符编码方法,使用1到4个字节来表示一个字符。它是Unicode标准的官方推荐编码。

例子:

str := "Go"
for i := 0; i < len(str); i++ {fmt.Printf("%x ", str[i])
}
// 输出: 47 6f 

Unicode码点与rune类型

定义: Unicode码点是每个字符的唯一数字表示。在Go中,可以使用rune类型来存储和处理Unicode码点。

例子:

str := "语言"
for _, char := range str {fmt.Printf("U+%04X ", char)
}
// 输出: U+8BED U+8A00

字符串与UTF-8互操作

获取字符串长度

定义: 使用len函数可以获取字符串的字节长度,但在UTF-8编码下,要获取字符数量需要使用utf8.RuneCountInString

例子:

str := "语言"
byteLen := len(str)
runeLen := utf8.RuneCountInString(str)
fmt.Println(byteLen)  // 输出: 6
fmt.Println(runeLen)  // 输出: 2
将字符串解码为rune切片

定义: 使用[]rune可以将字符串转换为rune切片。

例子:

str := "语言"
runes := []rune(str)
fmt.Println(runes)  // 输出: [35821 35328]

转换字符编码

尽管Go主要支持UTF-8,但有时可能需要与其他字符编码互操作,如ISO-8859-1或GBK。这时可以使用第三方库,例如golang.org/x/text/encoding

例子:

// 请首先安装 golang.org/x/text/encoding
import "golang.org/x/text/encoding/simplifiedchinese"
import "golang.org/x/text/transform"str := "语言"
encoder := simplifiedchinese.GB18030.NewEncoder()
encoded, _, _ := transform.String(encoder, str)
fmt.Println(encoded)  // 输出: GBK编码的字符串

5. Go字符串类型转换

在Go中,与字符串相关的类型转换非常常见。这涉及到将其他基本数据类型(如整数、浮点数)转换为字符串,或反之。以下部分探讨了这些常见的转换方法。

字符串与整数

整数转字符串

定义: 使用strconv.Itoa函数可以将整数转换为字符串。

例子:

num := 123
str := strconv.Itoa(num)
fmt.Println(str)  // 输出: "123"
字符串转整数

定义: strconv.Atoi函数可以将字符串转换为整数。

例子:

str := "456"
num, err := strconv.Atoi(str)
if err != nil {fmt.Println(err)
} else {fmt.Println(num)  // 输出: 456
}

字符串与浮点数

浮点数转字符串

定义: 使用strconv.FormatFloat函数,可以将浮点数转换为字符串。

例子:

f := 3.14
str := strconv.FormatFloat(f, 'f', 2, 64)
fmt.Println(str)  // 输出: "3.14"
字符串转浮点数

定义: strconv.ParseFloat函数可以将字符串转换为浮点数。

例子:

str := "5.67"
f, err := strconv.ParseFloat(str, 64)
if err != nil {fmt.Println(err)
} else {fmt.Println(f)  // 输出: 5.67
}

字符串与字节切片

字符串转字节切片

定义: 使用类型转换可以将字符串转换为字节切片。

例子:

str := "Go"
bytes := []byte(str)
fmt.Println(bytes)  // 输出: [71 111]
字节切片转字符串

定义: 使用类型转换,可以将字节切片转换为字符串。

例子:

bytes := []byte{72, 101, 108, 108, 111}
str := string(bytes)
fmt.Println(str)  // 输出: "Hello"

6. 总结

字符串在编程中是一个基本且不可或缺的数据类型。通过这篇文章,我们深入了解了Go语言中字符串的内部工作机制、操作、字符编码,以及如何进行各种类型的转换。这些知识点不仅展现了Go对字符串操作的强大功能,还揭示了它是如何优雅地处理多语言文本的。

从Go的设计哲学中,我们可以看到它如何平衡性能、安全性和易用性。字符串是只读的,这使得它在并发情况下是安全的。同时,Go使用UTF-8作为其默认编码,使得全球化的应用程序开发变得简单而直观。


关注【TechLead】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旧的Spring Security OAuth已停止维护,全面拥抱最新解决方案Spring SAS

Spring Authorization Server 替换 Shiro 指引 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用作为 SpringBoot 3.0 的最新…

c++异常机制(3) -- 异常类型和生命周期

目录 抛出的异常类型大致可以分为三种。 第一种 基本类型 1. 可以直接抛出常量 2. 也可以抛出定义好的变量 3. 如果我们使用const&#xff0c;会不会影响到异常的匹配。 第二种 字符串类型以及指针类型 1. 使用字符指针 注意: 2. 使用string类型 第三种 …

计算机专业大学生的简历,为何会出现在垃圾桶

为什么校招过后垃圾桶里全是简历&#xff0c;计算机专业的学生找工作有多难&#xff1f; 空哥这么跟你说吧&#xff0c;趁现在还来得及&#xff0c;这些事情你一定要听好了。 第一&#xff0c;计算机专业在学校学的东西是非常有限的&#xff0c;985211的还好&#xff0c;如果…

D365:LookUp

文章目录 前言一、复制onLookUp事件方法二、LookUp方法 前言 在Form的字段的onLookUp方法中&#xff0c;添加下拉框。 一、复制onLookUp事件方法 二、LookUp方法 [FormControlEventHandler(formControlStr(EcoResProductDetailsExtended, VyaKeyItemType_VyaMaterialSubCode…

面试经典150题——用最少数量的箭引爆气球

"The only person you are destined to become is the person you decide to be." - Ralph Waldo Emerson 1. 题目描述 2. 题目分析与解析 这个题目开始读题的时候是有点不好理解题意的&#xff0c;因此我先做个图让大家对于题意有更好更直观的理解再来分析题目。 …

如何使用Portainer创建Nginx容器并搭建web网站发布至公网可访问【内网穿透】

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

C# OpenVINO Crack Seg 裂缝分割 裂缝检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Crack Seg 裂缝分割 裂缝检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-29T16:35:48.364242 author&#xff1a;Ultralytics task&#xff1a;segment version&…

【生成式AI】ChatGPT原理解析(1/3)- 对ChatGPT的常见误解

Hung-yi Lee 课件整理 文章目录 误解1误解2ChatGPT真正在做的事情-文字接龙 ChatGPT是在2022年12月7日上线的。 当时试用的感觉十分震撼。 误解1 我们想让chatGPT讲个笑话&#xff0c;可能会以为它是在一个笑话的集合里面随机地找一个笑话出来。 我们做一个测试就知道不是这样…

C# Post数据或文件到指定的服务器进行接收

目录 应用场景 实现原理 实现代码 PostAnyWhere类 ashx文件部署 小结 应用场景 不同的接口服务器处理不同的应用&#xff0c;我们会在实际应用中将A服务器的数据提交给B服务器进行数据接收并处理业务。 比如我们想要处理一个OFFICE文件&#xff0c;由用户上传到A服务器…

基于springboot+vue的贸易行业crm系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Java-nio

一、NIO三大组件 NIO的三大组件分别是Channel&#xff0c;Buffer与Selector Java NIO系统的核心在于&#xff1a;通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如&#xff1a;文件、套接字)的连接。若需要使用 NIO 系统&#xff0c;需要获取用于连接 IO 设备的通…

Windows环境下的调试器探究——硬件断点

与软件断点与内存断点不同&#xff0c;硬件断点不依赖被调试程序&#xff0c;而是依赖于CPU中的调试寄存器。 调试寄存器有7个&#xff0c;分别为Dr0~Dr7。 用户最多能够设置4个硬件断点&#xff0c;这是由于只有Dr0~Dr3用于存储线性地址。 其中&#xff0c;Dr4和Dr5是保留的…

java中容器继承体系

首先上图 源码解析 打开Collection接口源码&#xff0c;能够看到Collection接口是继承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源码及注释 /** * Implementing this inte…

makefileGDB使用

一、makefile 1、make && makefile makefile带来的好处就是——自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率 下面我们通过如下示例来进一步体会它们的作用&#xff1a; ①…

使用 Python 实现一个飞书/微信记账机器人,酷B了!

Python飞书文档机器人 今天的主题是&#xff1a;使用Python联动飞书文档机器人&#xff0c;实现一个专属的记账助手&#xff0c;这篇文章如果对你帮助极大&#xff0c;欢迎你分享给你的朋友、她、他&#xff0c;一起成长。 也欢迎大家留言&#xff0c;说说自己想看什么主题的…

代码随想录第天 78.子集 90.子集II

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件