一、📘 案例目标
本案例旨在通过"字符串反转"的任务,帮助初学者深入理解 Go 语言中字符串的本质、Unicode 字符处理、切片的操作方式,以及基本算法思想(如双指针法)。反转操作虽然简单,但是许多高级功能的基础,如回文判断、字符串匹配、加密解密等。
二、📌 背景与应用场景
字符串反转的实用性远比你想象的广泛:
- 判断是否为回文字符串(后续案例会拓展)
- 用于字符串加密算法,如凯撒密码的逆转
- 在 UI 编程中实现输入动态反转(例如镜像效果)
- 在数据结构算法中作为常见笔试题和面试题
三、🛠 案例说明
我们将实现一个命令行程序:
- 提示用户输入任意字符串(英文、中文皆可);
- 程序将其反转后输出;
- 支持中文和特殊字符,不出现乱码。
四、🔑 涉及知识点讲解
1. Go语言中的字符串本质
Go 语言中的字符串是一个只读的 byte
序列,即 UTF-8 编码的字节数组。每个字符(rune)可能占用1~4个字节:
go
str := "Go语言"
fmt.Println(len(str)) // 输出8,而不是3,因为"语"占3字节
2. 为什么要用 rune
?
go
runes := []rune(str)
Go 中用 rune
类型处理 Unicode 字符(中文、表情符号等),避免多字节字符被错误切割。
3. 切片反转的常见方法
- 双指针法:头尾交换法,效率高,常用于反转数组、链表等。
- 倒序遍历法:临时新建切片存储反转后的值。
五、✅ 实现代码与解析
📄 完整代码示例
go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入一个字符串:")
input, _ := reader.ReadString('\n') // 读取一整行,包含空格
input = input[:len(input)-1] // 去除末尾的换行符(\n)
runes := []rune(input)
// 双指针反转切片
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
fmt.Println("反转后的字符串:", string(runes))
}
📊 逐步解析
步骤 | 说明 |
---|---|
使用 bufio.NewReader |
支持读取带空格、符号、换行的整行内容 |
ReadString('\n') |
读取输入直到用户按下回车 |
[]rune(input) |
将字符串转换为 rune 切片,便于处理中文等多字节字符 |
for 循环双指针法 |
前后交换字符,原地反转,效率高且占用内存少 |
输出结果 | 使用 string(runes) 将 rune 切片还原为字符串 |
六、🧪 多组示例运行
示例1(英文)
请输入一个字符串:Golang
反转后的字符串:gnaloG
示例2(含空格)
请输入一个字符串:hello world
反转后的字符串:dlrow olleh
示例3(中文)
请输入一个字符串:学Go真快乐
反转后的字符串:乐快真oG学
示例4(中英混排)
请输入一个字符串:Hello 世界
反转后的字符串:界世 olleH
七、⛔ 错误示范:不使用 rune 的问题
以下写法会导致中文字符乱码:
go
str := "学Go"
bytes := []byte(str)
for i := len(bytes) - 1; i >= 0; i-- {
fmt.Printf("%c", bytes[i])
}
输出可能是:
�oG�
说明:多字节的"学"被错误拆分。
八、💡 进阶优化版本:封装成函数
go
func reverseString(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
调用示例:
go
fmt.Println("反转后的字符串:", reverseString("Go语言"))
九、🧩 拓展练习
- 反转多个字符串并依次输出
- 仅反转英文字母,保留其他字符顺序不变
- 写一个判断是否为回文字符串的函数
- 将反转逻辑封装为支持切片/数组的泛型版本(Go 1.18+)
🔚 小结
字符串反转这个案例看似简单,但却涵盖了很多 Go 编程的核心技巧:Unicode处理、切片操作、算法思维。通过这个案例,初学者能建立起"Go处理中文需用rune"的基本意识,并掌握一种实用的字符串操作模式。