0

0

Golang Strings包IndexAny与LastIndex用法_查找字符集位置

P粉602998670

P粉602998670

发布时间:2026-02-20 16:59:42

|

546人浏览过

|

来源于php中文网

原创

strings.indexany 查找字符串中第一个出现在字符集中的字符并返回其索引,不匹配子串;字符集为 string 类型,按 rune 处理,空字符集返回 -1,需判空防 panic。

golang strings包indexany与lastindex用法_查找字符集位置

IndexAny 找第一个匹配字符,不是找子串

strings.IndexAny 在字符串里搜索任意一个出现在「字符集」中的字符,返回它第一次出现的索引。容易误以为它在找子串或按顺序匹配多个字符——其实不是。
比如 strings.IndexAny("hello", "aeiou") 返回 1(因为 e 是第一个元音),而不是找 "aeiou" 这个串。

常见错误现象:
• 传入空字符串 "" 作字符集 → 返回 -1(合法但易被忽略)
• 字符集含 Unicode 超出 ASCII 范围(如中文、emoji)→ 没问题,Go 的 string 是字节序列,IndexAny 按 rune 处理,自动解码 UTF-8

  • 字符集是 string 类型,每个字符独立参与匹配,顺序无关
  • 如果没找到,返回 -1,别直接用作切片下标
  • 性能上,最坏是 O(n×m),n 是原串长度,m 是字符集长度;字符集尽量短,避免传 "abcdefghijklmnopqrstuvwxyz" 这类长串

LastIndex 查末尾位置,但只对完整子串有效

strings.LastIndex 只匹配「完整子串」,不是字符集。它从后往前找,返回最后一次出现该子串的起始索引。和 IndexAny 完全不同用途,名字相似但行为不重叠。

常见错误现象:
• 误用 strings.LastIndex("hello", "o") 想找最后一个字符 → 结果是对的(返回 4),但这是巧合;换成 strings.LastIndex("hello", "ll") 就能看清它是按子串匹配
• 传入空子串 "" → 总是返回原字符串长度(Go 文档明确约定),不是 -1

立即学习go语言免费学习笔记(深入)”;

MedPeer
MedPeer

AI驱动的一站式科研服务平台

下载
  • 只支持子串搜索,不支持通配或字符集合
  • 区分大小写,strings.LastIndex("Hello", "h") 返回 -1
  • 若需从后往前查单个字符,应改用 strings.LastIndexAny,不是 LastIndex

字符集搜索选 IndexAny / LastIndexAny,别混用 Index / LastIndex

要查「某个字符是否在字符串中」或「找其中任一字符的位置」,必须用 IndexAnyLastIndexAny。用 Index/LastIndex 去查单字符,代码能跑,但语义错、可读性差、且遇到多字节字符时逻辑可能意外失效。

使用场景对比:
• 解析 CSV 行,找下一个 ," 或换行符 → strings.IndexAny(line, "," ")
• 提取路径最后一段:找最后一个 /strings.LastIndexAny(path, "/\")

  • IndexAnyLastIndexAny 才是字符集搜索的正确接口
  • 字符集字符串里重复字符无影响,"aa""a" 效果一样
  • 注意 Windows 路径分隔符 是转义字符,写成 "\\" 或用反引号 `\` 字面量更安全

Unicode 和空字符串边界情况必须检查

Go 的 strings 包函数全部基于 UTF-8 编码处理 rune,这点很可靠。但空字符串、全 ASCII vs 混合 Unicode 的索引值表现一致,不代表你可以忽略边界。

容易被忽略的点:
strings.IndexAny("?abc", "?") 返回 0,没问题;但 strings.IndexAny("?abc", "")(非法 UTF-8)会把 当单个字节匹配,可能命中内部字节 —— 实际中应确保字符集本身是合法 UTF-8

  • 对空字符串调用任何 Index* 函数都返回 -1,但对空字符集("")调用 IndexAny 也返回 -1,两者含义不同
  • 若原字符串含无效 UTF-8,IndexAny 仍按字节匹配,不会 panic,但结果可能不符合直觉
  • 所有索引返回值都可能是 -1,用前务必判断,尤其做切片时:s[i:]i == -1 会 panic

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

239

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

403

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

344

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

197

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

990

2025.06.17

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号