Go语言实战案例-字符串反转

一、📘 案例目标

本案例旨在通过"字符串反转"的任务,帮助初学者深入理解 Go 语言中字符串的本质、Unicode 字符处理、切片的操作方式,以及基本算法思想(如双指针法)。反转操作虽然简单,但是许多高级功能的基础,如回文判断、字符串匹配、加密解密等。


二、📌 背景与应用场景

字符串反转的实用性远比你想象的广泛:

  • 判断是否为回文字符串(后续案例会拓展)
  • 用于字符串加密算法,如凯撒密码的逆转
  • 在 UI 编程中实现输入动态反转(例如镜像效果)
  • 在数据结构算法中作为常见笔试题和面试题

三、🛠 案例说明

我们将实现一个命令行程序:

  1. 提示用户输入任意字符串(英文、中文皆可);
  2. 程序将其反转后输出;
  3. 支持中文和特殊字符,不出现乱码。

四、🔑 涉及知识点讲解

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语言"))

九、🧩 拓展练习

  1. 反转多个字符串并依次输出
  2. 仅反转英文字母,保留其他字符顺序不变
  3. 写一个判断是否为回文字符串的函数
  4. 将反转逻辑封装为支持切片/数组的泛型版本(Go 1.18+)

🔚 小结

字符串反转这个案例看似简单,但却涵盖了很多 Go 编程的核心技巧:Unicode处理、切片操作、算法思维。通过这个案例,初学者能建立起"Go处理中文需用rune"的基本意识,并掌握一种实用的字符串操作模式。

相关推荐
MemoleCard10 小时前
深度解析Java当中的锁机制
后端
wear工程师11 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
whyfail11 小时前
前端学 Spring Boot(2):一次点击,如何穿过整个后端?
前端·spring boot·后端
程序员cxuan13 小时前
Loop 还没玩明白,Graph Engineering 又火了。
人工智能·后端·程序员
uzong13 小时前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
程序员海军14 小时前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
不能放弃治疗14 小时前
MCP
后端
江湖十年15 小时前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
你驴我16 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python