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 字符串
  • • 如何使用双指针法判断逻辑
  • • 如何封装通用业务逻辑函数

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

 

相关文章
|
2月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
|
3月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
321 0
|
2月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
3月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
457 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
3月前
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
3月前
|
数据采集 Go API
Go语言实战案例:使用context控制协程取消
本文详解 Go 语言中 `context` 包的使用,通过实际案例演示如何利用 `context` 控制协程的生命周期,实现任务取消、超时控制及优雅退出,提升并发程序的稳定性与资源管理能力。
|
3月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
3月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
Go
Go实战(一)-概述
Go实战(一)-概述
165 0
Go实战(一)-概述
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
156 1