跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Go / Golang算法

Go 语言字符串反转算法实现

讲解 Go 语言字符串反转算法,区分 ASCII 与 Unicode 处理方式。通过 byte 和 rune 两种类型实现反转,利用双指针算法优化效率,避免中文乱码。包含完整工具类代码、测试用例及常见问题解答,适用于文本处理与面试场景。

清心发布于 2026/3/30更新于 2026/9/671 浏览

项目背景

字符串反转(Reverse String)是编程语言中最经典、最基础的算法之一,也是很多技术面试、算法题和系统底层库中经常使用的操作。

在实际开发中,字符串反转并不仅仅是算法练习,它在很多真实场景中都会用到,例如:

1. 日志分析系统

日志 ID 或 Token 需要反向处理进行匹配。

2. 编码与解码

部分简单加密算法会使用字符串反转作为步骤之一。

3. 文本处理

如自然语言处理中的回文检测。

4. URL 处理

部分系统需要反转字符串进行索引优化。

5. 算法题

很多算法问题都会以字符串反转作为基础步骤,例如:

  • 回文字符串判断
  • 单词反转
  • 数字反转
  • 双指针算法练习

例如:

输入字符串:hello 输出:olleh

但在 Go 语言中,实现字符串反转并不像表面那么简单,因为:

Go 字符串是 UTF-8 编码。

因此需要考虑:

  • ASCII 字符
  • Unicode 字符(中文)
  • emoji 字符

如果处理不当,可能会出现乱码。

因此本教程将实现:

  1. 基础 ASCII 版本
  2. Unicode 安全版本
  3. 双指针高性能版本
  4. rune 版本
  5. 企业级封装版本

项目需求

基础需求

实现函数:

func ReverseString(str string) string

功能:

  • 将字符串顺序反转
  • 返回新的字符串

输入输出示例

输入:hello 输出:olleh

输入:golang 输出:gnalog

Unicode 示例

输入:你好世界 输出:界世好你

特殊情况

输入:"" 输出:""

输入:a 输出:a

进阶需求

实现:

  • ASCII 版本
  • Unicode 版本
  • 高性能双指针版本
  • 封装结构体版本
  • 示例测试程序

相关技术

Go 字符串结构

Go 字符串:

  • UTF-8 编码
  • 不可变类型
  • 底层是字节数组

例如:hello

底层:[104 101 108 108 111]

rune 类型

Go 中字符使用 rune 表示。

for _, r := range str

优点:

  • 自动解析 UTF-8 字符
  • 支持中文

ASCII 与 Unicode

类型字符长度
ASCII 字符1 字节
中文3 字节
emoji4 字节

因此:

直接反转 byte 会导致中文乱码。

双指针算法

字符串反转最经典算法:

left = 0 right = n-1 swap(left, right)

时间复杂度:O(n) 空间复杂度:O(n)


实现思路

我们实现两种核心算法。

方法一:ASCII 反转(byte 版本)

流程:

  1. 字符串转 byte 数组
  2. 设置左右指针
  3. 交换字符
  4. 返回字符串

示例:hello 过程: h e l l o o l l e h

优点:

  • 速度最快

缺点:

  • 不支持 Unicode

方法二:Unicode 安全版本(rune)

流程:

  1. 转换为 rune 数组
  2. 双指针交换
  3. 返回字符串

优点:

  • 支持中文
  • 支持 emoji

完整实现代码

// ===================================== // file: reverse/reverse.go // ===================================== package reverse

// StringReverser 字符串反转结构体
type StringReverser struct{}

// NewStringReverser 创建实例
func NewStringReverser() *StringReverser {
	return &StringReverser{}
}

// ReverseASCII ASCII 版本字符串反转
// 适用于仅包含英文字符的字符串
func (r *StringReverser) ReverseASCII(str string) string {
	if len(str) <= 1 {
		return str
	}
	bytes := []byte(str)
	left := 0
	right := len(bytes) - 1
	for left < right {
		bytes[left], bytes[right] = bytes[right], bytes[left]
		left++
		right--
	}
	return string(bytes)
}

// ReverseUnicode Unicode 安全版本
func (r *StringReverser) ReverseUnicode(str string) string {
	if str == "" {
		return ""
	}
	runes := []rune(str)
	left := 0
	right := len(runes) - 1
	for left < right {
		runes[left], runes[right] = runes[right], runes[left]
		left++
		right--
	}
	return string(runes)
}

// ===================================== // file: main.go // ===================================== package main

import (
	"fmt"
	"reverse/reverse"
)

func main() {
	reverser := reverse.NewStringReverser()
	testCases := []string{
		"hello",
		"golang",
		"hello world",
		"你好世界",
		"",
	}
	for _, s := range testCases {
		fmt.Println("原字符串:", s)
		fmt.Println("ASCII 反转:", reverser.ReverseASCII(s))
		fmt.Println("Unicode 反转:", reverser.ReverseUnicode(s))
		fmt.Println("----------------------------")
	}
}

代码解读

NewStringReverser

构造函数。创建字符串反转工具实例。

ReverseASCII

功能:实现 ASCII 字符串反转。

步骤:

  1. 转换为 byte 数组
  2. 使用双指针
  3. 交换字符
  4. 返回字符串

特点:

  • 非常高效
  • 不支持 Unicode

ReverseUnicode

功能:实现 Unicode 安全字符串反转。

步骤:

  1. 转换为 rune 数组
  2. 使用双指针交换
  3. 返回字符串

优点:

  • 支持中文
  • 支持 emoji
  • 企业系统推荐

总结

本项目实现了一个完整的字符串反转算法工具,包含:

功能:

  • ASCII 字符串反转
  • Unicode 字符串反转
  • 双指针算法
  • 工具类封装
  • 示例程序

算法复杂度:

时间复杂度:O(n) 空间复杂度:O(n)

适用于:

  • 文本处理系统
  • 日志分析
  • 算法学习
  • 面试题练习
  • 高并发字符串处理

常见问题

Q1 为什么不能直接反转 byte?

因为 Go 字符串是 UTF-8。

中文示例:你好

byte 反转会变成乱码。

Q2 什么时候使用 ASCII 版本?

适用于:

  • 只包含英文
  • 高性能系统

Q3 企业系统推荐哪种?

推荐:rune 版本

保证 Unicode 安全。

Q4 strings.Builder 能反转吗?

Builder 主要用于拼接字符串,不适合反转。


扩展方向

1. 实现单词反转算法

例如:hello world 变成:world hello

2. 实现回文字符串检测

例如:level

3. 实现字符串旋转算法

例如:abcdef 变成:defabc

4. 实现高性能字符串算法库

例如:strutil

包含:

  • Reverse
  • Trim
  • Replace
  • Compare

结语

本教程完整实现了:

Go 语言反转字符串算法(ASCII + Unicode 版本)。

通过本项目你可以掌握:

  • 双指针算法
  • UTF-8 字符串处理
  • rune 与 byte 区别
  • Go 字符串底层原理

目录

  1. 项目背景
  2. 1. 日志分析系统
  3. 2. 编码与解码
  4. 3. 文本处理
  5. 4. URL 处理
  6. 5. 算法题
  7. 项目需求
  8. 基础需求
  9. 输入输出示例
  10. Unicode 示例
  11. 特殊情况
  12. 进阶需求
  13. 相关技术
  14. Go 字符串结构
  15. rune 类型
  16. ASCII 与 Unicode
  17. 双指针算法
  18. 实现思路
  19. 方法一:ASCII 反转(byte 版本)
  20. 方法二:Unicode 安全版本(rune)
  21. 完整实现代码
  22. 代码解读
  23. NewStringReverser
  24. ReverseASCII
  25. ReverseUnicode
  26. 总结
  27. 常见问题
  28. Q1 为什么不能直接反转 byte?
  29. Q2 什么时候使用 ASCII 版本?
  30. Q3 企业系统推荐哪种?
  31. Q4 strings.Builder 能反转吗?
  32. 扩展方向
  33. 1. 实现单词反转算法
  34. 2. 实现回文字符串检测
  35. 3. 实现字符串旋转算法
  36. 4. 实现高性能字符串算法库
  37. 结语

更多推荐文章

查看全部
  • Spring IoC 容器与依赖注入核心机制详解
  • OpenClaw 机器人抓取平台搭建全流程详解
  • 语义化 AI 驱动器与提示词工程的技术演进
  • C++ 中的 and、or、not 替代标记详解
  • Kimi K2.5 实测:多模态与编程能力能否兼得
  • 大模型技术解析:定义、架构与发展趋势
  • 二级 Python 考试真题及参考代码合集(基本操作题)
  • GitHub 学生开发者包认证流程与注意事项
  • 免费开源 AI 工具 CoPaw 与 OpenFang 本地部署指南
  • MAC M1 本地部署 Llama.cpp 与通义千问 Qwen 1.5-7B 实践指南
  • 深度学习模型优化策略与实战调参
  • 前端模块化开发:从面条代码到结构化代码
  • 大语言模型(LLM)学习路径:从入门到实战指南
  • 医疗多模态大模型概述:医学影像分析与核心算法总结
  • OpenClaw 浏览器自动化配置与运行状态排查
  • GitHub、谷歌学术与 Sci-Hub 镜像站使用指南
  • Harness Engineering:AI 时代的工程最佳实践
  • GitHub Copilot 同步 Claude Code 本地技能与 Agent 映射方案
  • C++ 继承:面向对象代码复用的核心机制
  • AI 产品经理入门指南:《AI 赋能》书籍推荐与学习路径

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online