Go语言实战案例-判断回文字符串-是不是正着念反着念都一样?

简介: 本案例实现判断回文字符串程序,支持中文、英文、标点及空格处理。通过双指针法与Unicode字符比较,帮助读者掌握字符串处理技巧与逻辑编程基础。

 

一、📘 案例目标

本案例将实现一个程序,判断用户输入的字符串是否是“回文字符串”,即:正着读和反着读都一样的字符串。

例如:

  • • ✅“上海自来水来自海上”是回文
  • • ✅“ABBA”是回文
  • • ❌“Hello”不是回文

通过本案例,读者可以:

  • • 熟练掌握字符串处理技巧
  • • 学会用双指针法判断回文
  • • 掌握 Unicode 字符比较的正确方法
  • • 开始编写结构清晰的业务逻辑函数

二、 案例背景与应用场景

“回文字符串”常出现在编程面试题、数据结构与算法课程、文本处理程序中。实际应用包括:

  • • 自然语言处理(如检测对称结构、标注)
  • • 文本对称性分析
  • • 前端交互逻辑(如输入检查)
  • • 字符串加密/反解的规则判定

三、 案例说明

  1. 1. 用户在命令行输入任意一段文字;
  2. 2. 程序判断其是否为回文字符串;
  3. 3. 支持中文、英文、标点、空格;
  4. 4. 忽略空格、大小写和标点干扰;
  5. 5. 输出判断结果。

四、 涉及知识点讲解

1. 什么是回文?

回文(Palindrome)是指从左到右和从右到左读起来都一样的字符串,如“ABBA”“level”“我爱我”。

2. 字符串预处理

为了精准判断,我们需要:

  • • 忽略空格
  • • 忽略大小写差异
  • • 移除标点符号(可选)

3. 如何比较?

使用双指针法:一头一尾向中间靠拢进行字符比较。


五、完整实现代码

📄 示例代码

package main
import (
    "bufio"
    "fmt"
    "os"
    "strings"
    "unicode"
)
func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("请输入一句话:")
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input)
    if isPalindrome(input) {
        fmt.Println("这是一个回文字符串 ✅")
    } else {
        fmt.Println("这不是一个回文字符串 ❌")
    }
}
// 判断是否为回文字符串
func isPalindrome(s string) bool {
    // 预处理:移除空格、标点,统一小写
    var filtered []rune
    for _, r := range []rune(s) {
        if unicode.IsLetter(r) || unicode.IsDigit(r) {
            filtered = append(filtered, unicode.ToLower(r))
        }
    }
    // 双指针判断
    for i, j := 0, len(filtered)-1; i < j; i, j = i+1, j-1 {
        if filtered[i] != filtered[j] {
            return false
        }
    }
    return true
}

六、代码解析

关键部分 说明
unicode.IsLetter/IsDigit 过滤掉标点、空格等非字符内容
unicode.ToLower(r) 忽略大小写差异
双指针法 i, j 分别从头尾向中间比较字符是否一致
使用 rune 切片 确保支持多字节中文字符,不乱码

七、示例运行

示例1:

请输入一句话:ABBA
这是一个回文字符串 ✅

示例2:

请输入一句话:A man a plan a canal Panama
这是一个回文字符串 ✅

示例3:

请输入一句话:Go语言真的好
这不是一个回文字符串 ❌

示例4(中文):

请输入一句话:上海自来水来自海上
这是一个回文字符串 ✅

八、常见错误示范

错误1:直接反转字符串做对比

return s == reverse(s)

这种写法没有处理空格、大小写、标点,容易误判。

错误2:使用 []byte 而非 []rune

for i, j := 0, len(s)-1; i < j; ...

如果 s 中有中文字符,会乱码或报错。建议始终使用 []rune(s)


九、扩展任务

  • • ✔ 写一个函数,返回所有输入中的回文子串
  • • ✔ 支持多语言判断(如日语、韩语等)
  • • ✔ 在 Web 中实现前端页面的回文检测(使用 Go 后端 API)

🔚 小结

通过本案例你学到了:

  • • 如何标准化字符串进行比较
  • • 如何正确处理 Unicode 字符串
  • • 如何使用双指针法判断逻辑
  • • 如何封装通用业务逻辑函数

回文判断是一个典型的逻辑题目,也常用于笔试和基础项目中,掌握这一方法也为你打下算法与数据结构学习的基础。

 

目录
打赏
0
5
6
0
68
分享
相关文章
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
169 0
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
Go语言实战案例:使用channel实现生产者消费者模型
本文是「Go语言100个实战案例 · 网络与并发篇」第4篇,通过实战案例详解使用 Channel 实现生产者-消费者模型,涵盖并发控制、任务调度及Go语言并发哲学,助你掌握优雅的并发编程技巧。
Go语言实战案例:使用 Goroutine 并发打印
本文通过简单案例讲解 Go 语言核心并发模型 Goroutine,涵盖协程启动、输出控制、主程序退出机制,并结合 sync.WaitGroup 实现并发任务同步,帮助理解 Go 并发设计思想与实际应用。
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
Go语言实战:图的邻接表表示法实现详解
本文是《Go语言100个实战案例》系列之一,讲解图的邻接表表示法及其在Go语言中的实现。适用于稀疏图,节省空间,适合初学者与进阶开发者学习图结构在工程中的应用。
Go实战(一)-概述
Go实战(一)-概述
154 0
Go实战(一)-概述
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等