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

发布于:2025-07-15 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、📘 案例目标

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


二、📌 背景与应用场景

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

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

三、🛠 案例说明

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

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

四、🔑 涉及知识点讲解

1. Go语言中的字符串本质

Go 语言中的字符串是一个只读的 byte 序列,即 UTF-8 编码的字节数组。每个字符(rune)可能占用1~4个字节:

str := "Go语言"
fmt.Println(len(str)) // 输出8,而不是3,因为“语”占3字节
2. 为什么要用 rune
runes := []rune(str)

Go 中用 rune 类型处理 Unicode 字符(中文、表情符号等),避免多字节字符被错误切割。

3. 切片反转的常见方法
  • • 双指针法:头尾交换法,效率高,常用于反转数组、链表等。
  • • 倒序遍历法:临时新建切片存储反转后的值。

五、✅ 实现代码与解析

📄 完整代码示例
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 的问题

以下写法会导致中文字符乱码:

str := "学Go"
bytes := []byte(str)
for i := len(bytes) - 1; i >= 0; i-- {
    fmt.Printf("%c", bytes[i])
}

输出可能是:

�oG�

说明:多字节的“学”被错误拆分。


八、💡 进阶优化版本:封装成函数

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)
}

调用示例:

fmt.Println("反转后的字符串:", reverseString("Go语言"))

九、🧩 拓展练习

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

🔚 小结

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


网站公告

今日签到

点亮在社区的每一天
去签到