Go语言中获取子字符串的字符(Rune)位置

go语言中获取子字符串的字符(rune)位置

在Go语言中,`strings.Index`返回的是子字符串的字节位置,而非字符(rune)位置,这在处理Unicode字符串时会导致错误。本教程将深入讲解如何利用`unicode/utf8`包中的`RuneCountInString`函数,结合`strings.Index`,准确获取子字符串的字符位置。同时,还将探讨截取字符串前N个字符的最佳实践,确保Go语言中Unicode字符串操作的准确性。

理解Go语言中的字符串与字符

Go语言中的字符串是UTF-8编码的字节序列。这意味着一个“字符”可能由一个或多个字节组成。例如,ASCII字符(如’a’)占用1个字节,而许多Unicode字符(如中文汉字或带音调的拉丁字母)可能占用2、3甚至4个字节。

strings.Index(s, sub) 函数返回的是子字符串 sub 在字符串 s 中首次出现的字节索引。当字符串只包含单字节字符时,字节索引与字符索引是一致的。然而,一旦字符串中包含多字节字符,字节索引就会与我们通常理解的“字符位置”产生偏差。

考虑以下示例:

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

package mainimport (    "fmt"    "strings")func main() {    s := "áéíóúÁÉÍÓÚ"    // 查找 "ÍÓ" 的字节索引    byteIndex := strings.Index(s, "ÍÓ")    fmt.Printf("字符串: "%s"n", s)    fmt.Printf("子字符串 "ÍÓ" 的字节索引: %dn", byteIndex)    // 预期字符索引是 7    // 'á' 'é' 'í' 'ó' 'ú' 'Á' 'É' 'Í' 'Ó' 'Ú'    //  0   1   2   3   4   5   6   7   8   9}

运行上述代码,输出结果是 14。这是因为字符串 s 中的每个带音调的字符都占用2个字节,因此前6个字符(áéíóúÁ)已经占用了 6 * 2 = 12 个字节。第七个字符 É 占用2个字节,其起始字节索引是 12。而 ÍÓ 的起始字符 Í 是字符串中的第八个字符,其起始字节索引是 14。然而,我们通常期望的字符位置是 7(从0开始计数)。

获取子字符串的字符(Rune)位置

为了获取子字符串的字符(rune)位置,我们需要将字节索引转换为字符索引。Go标准库提供了 unicode/utf8 包,其中的 RuneCountInString 函数可以帮助我们实现这一转换。

utf8.RuneCountInString(s string) 函数返回字符串 s 中包含的 Unicode 字符(rune)的数量。我们可以利用它来计算从字符串开头到 strings.Index 返回的字节位置之间有多少个字符。

Riffusion Riffusion

AI生成不同风格的音乐

Riffusion 87 查看详情 Riffusion

以下是获取子字符串字符位置的正确方法:

package mainimport (    "fmt"    "strings"    "unicode/utf8" // 导入 unicode/utf8 包)func main() {    s := "áéíóúÁÉÍÓÚ"    sub := "ÍÓ"    // 1. 首先使用 strings.Index 获取子字符串的字节索引    byteIndex := strings.Index(s, sub)    if byteIndex == -1 {        fmt.Printf("子字符串 "%s" 未在字符串中找到。n", sub)        return    }    // 2. 使用 utf8.RuneCountInString 计算从字符串开头到该字节索引之间的字符数量    // s[:byteIndex] 截取了从字符串开头到子字符串起始字节位置的子字符串    runeIndex := utf8.RuneCountInString(s[:byteIndex])    fmt.Printf("字符串: "%s"n", s)    fmt.Printf("子字符串 "%s" 的字节索引: %dn", byteIndex)    fmt.Printf("子字符串 "%s" 的字符(rune)索引: %dn", runeIndex)}

运行上述代码,输出将是:

字符串: "áéíóúÁÉÍÓÚ"子字符串 "ÍÓ" 的字节索引: 14子字符串 "ÍÓ" 的字符(rune)索引: 7

这正是我们所期望的字符位置。

截取字符串的前N个字符

在Go语言中,如果需要截取字符串的前 n 个字符(而不是前 n 个字节),最常见且推荐的做法是将字符串转换为 []rune 切片,然后进行切片操作,最后再转换回 string。

package mainimport "fmt"func main() {    s := "你好世界HelloGo"    n := 4 // 截取前4个字符    // 将字符串转换为 []rune 切片    runes := []rune(s)    // 检查 n 是否超出字符串的字符长度    if n  len(runes) {        n = len(runes)    }    // 截取前 n 个字符的 rune 切片    firstNRunes := runes[:n]    // 将 rune 切片转换回字符串    result := string(firstNRunes)    fmt.Printf("原始字符串: "%s"n", s)    fmt.Printf("截取前 %d 个字符的结果: "%s"n", n, result) // 预期输出: "你好世界"}

这种方法是Go语言中处理字符级字符串截取的标准和推荐方式,因为它直接操作 Unicode 字符(rune),避免了字节编码带来的问题。

总结

在Go语言中处理包含多字节字符的Unicode字符串时,务必区分字节索引和字符(rune)索引。

获取子字符串的字符位置: 结合使用 strings.Index 获取字节索引,然后使用 unicode/utf8.RuneCountInString 计算从字符串开头到该字节索引之间的字符数量,从而得到字符位置。截取字符串的前N个字符: 将字符串转换为 []rune 切片进行操作,然后再转换回 string。

理解Go语言字符串的UTF-8编码特性以及何时需要显式处理 rune 类型,是编写健壮和正确处理国际化文本的关键。

以上就是Go语言中获取子字符串的字符(Rune)位置的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/948195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 17:14:25
下一篇 2025年12月1日 17:14:46

相关推荐

  • 以太坊巨鲸1.35亿ETH大转移:V神预警,清算潮临近?

    目录 一、巨鲸突袭:1.35亿美元ETH涌入交易所,引发抛售担忧二、V神预警的“清算潮”:过度杠杆的潜在风险三、链上数据与市场情绪:看涨势头与潜在回调结语: 以太坊(ETH)价格近期强势上扬,一度冲破4,444美元关键位,逼近2021年历史峰值。然而,在市场情绪高涨之际,突发的链上异动引发广泛关注:…

    2025年12月10日
    000
  • 加密市场普遍进入冲高回调阶段 ,机构资金加速流入以太坊(ETH)

    目录 加密市场全景掘金热门代币BCH BitcoinCash(+2.95%,流通市值 117.77 亿美元)UNI Uniswap(+0.49%,流通市值 71.62 亿美元)LDO Lido(+1.90%,流通市值 13.69 亿美元)Alpha 解读今日山寨市场普遍进入冲高回调,加密市场市值跌幅…

    2025年12月10日
    000
  • Circle 上市后会如何影响稳定币市场? USDT,USDC,DAI 优缺点比较

    Circle,作为一家在金融科技领域具有重要影响力的公司,其上市计划无疑将对整个稳定币市场产生深远的影响。Circle 主要以发行和管理稳定币 USDC 而闻名,USDC 是目前市场上第二大稳定币,与美元挂钩,旨在为数字资产交易提供稳定性和可靠性。 Circle最初是一家点对点支付技术公司,现在管理…

    2025年12月10日
    000
  • 以太坊有可能超越比特币吗?一文速览币圈知名人士的看法

    无论人们将其称作“颠覆”还是“逆转”,以太坊市值超过比特币的现象普遍被称作“翻转”。 如今,随着ETH价格突破4300美元,逼近4878美元的历史高点,这一“翻转”是否真的会成真? 以太坊能否最终摘下比特币的“王者桂冠”? 目前,以太坊的市值约为5000亿美元,而比特币市值高达2.3万亿美元,约为前…

    2025年12月10日
    000
  • 全球最大的比特币交易所 币安交易所官方网站

    币安是全球最大的加密货币交易所,凭借庞大的交易深度、丰富的业务生态和高流动性,提供现货、合约、理财及BNB Chain公链等全方位服务,同时通过多重安全措施和合规努力保障用户资产安全并推动透明化发展。 从交易量和用户规模来看,币安(binance)是全球公认的最大的加密货币交易所。它提供广泛的数字资…

    2025年12月10日
    000
  • ETH将百倍超越BTC的可能性分析

    目录 首先,BTC 是唯一无需信任的基础层。其次,BTC 运行在约每秒 1 泽哈希的 PoW 算力上。(教链注:每秒 1 泽哈希 ZettaHash 等于每秒 1000 艾哈希 ExaHash,约 10^21 H/s)第三,权益证明 PoS 本质上是人为治理。第四,ETH 多次更改规则。第五,赢家通…

    2025年12月10日
    000
  • 稳定币是谁发行的 稳定币是由哪个国家提出的

    稳定币由私营实体发行而非国家提出,是市场需求驱动的产物。中心化公司如Tether发行USDT,Circle发行USDC;去中心化组织MakerDAO通过抵押加密资产发行DAI。 稳定币作为连接加密世界与传统金融的关键桥梁,其价值稳定性使其成为交易和储值的重要工具。本文将深入探讨稳定币的发行主体究竟是…

    2025年12月10日
    000
  • 数字货币市场,区块链技术的影响力评估

    区块链技术通过去中心化、不可篡改和透明化特性深刻影响数字货币市场,推动金融创新、提升数据信任并构建新型经济生态;其在支付、证券、资产管理等领域颠覆传统金融模式,数字货币交易所则作为关键枢纽提供交易、流动性和价格发现功能,全球主要平台包括Binance、OKX和Huobi Global;智能合约实现D…

    2025年12月10日
    000
  • 2025下一个千倍币可能有哪些 2025可能的千倍币盘点

    2025年千倍币潜力赛道包括AI+Crypto、DePIN、RWA、GameFi、新叙事Meme币及Layer2与模块化生态;2. 这些领域具备小市值、高增长、强技术或社区基础,结合真实用例与代币经济,有望在牛市中爆发;3. 投资需关注项目底层技术、社区活力、交易所上线潜力,并严格控制风险,仅用可承…

    2025年12月10日
    000
  • 2025香港虚拟币交易所综合评测 十大安全可靠APP完整榜单

    对于身处香港的投资者而言,理解市场上的主要平台及其特点,能帮助他们在复杂多变的加密货币世界中做出明智的决策。香港作为全球金融中心,其虚拟资产交易市场同样展现出活跃的态势,众多平台竞相提供服务。本次评估聚焦于当前市场上表现突出、广受用户信赖的虚拟币交易平台,从多个维度进行审视,旨在呈现一份详尽的榜单,…

    2025年12月10日 好文分享
    000
  • 币安交易所app官网正确地址

    币安官网的正确地址为:,1. 币安是全球领先的加密货币交易平台,交易量长期位居榜首,支持超350种数字货币和1600多个交易对;2. 提供丰富的服务,包括现货交易、衍生品交易、理财服务及Web3生态集成;3. 采用冷存储、SAFU基金等多重安全措施,并在部分国家取得合规牌照;4. 平台代币BNB可用…

    2025年12月10日 好文分享
    000
  • 币安交易所app入口官网2025

    币安注册流程为:1、打开币安App点击【注册】;2、选择邮箱、手机号或Apple/谷歌账户注册;3、注意账户类型不可更改;4、输入信息并设置至少8个字符含大写字母和数字的密码;5、在30分钟内输入邮箱或手机收到的6位验证码完成验证;6、注册成功后进行身份认证(KYC);7、中国大陆用户选择“中国”并…

    2025年12月10日 好文分享
    100
  • 2025山寨币还会起飞吗?哪些山寨币潜力还没被发掘出来

    是的,2025年山寨币将迎来分化式起飞,少数优质项目有望百倍增长,但90%可能归零;1. AI+区块链(TAO、AKT、RNDR)、2. 模块化区块链(TIA、DYM)、3. RWA(ONDO、CFG)、4. 高性能公链与Meme基础设施(SUI、MemeCore)为四大潜力赛道;顶级分析师押注TA…

    2025年12月10日
    000
  • 一万本金如何在币圈一年赚千万?高胜率交易策略公开!

    用一万本金在风高浪急的币圈市场实现千万收益,这并非天方夜谭,它是一条险峻的、专属于极少数人的路径。这条路摒弃了传统金融的稳健与保守,转而拥抱极致的波动性与周期性。它需要的不是运气,而是一套严密、冷酷且可复制的交易系统。这个系统融合了对市场情绪的精准洞察、对项目基本面的深度挖掘以及钢铁般的执行纪律。想…

    2025年12月10日
    000
  • 币圈低本金如何高效复利?这七个方法让你稳赚不赔!

    在数字货币领域,本金的规模并非成功的唯一决定因素。对于低本金的参与者,掌握高效的复利策略,利用时间和策略的力量,同样可以实现资产的稳健增值。关键在于采用正确的思维方式和执行严谨的操作纪律。以下将介绍七个核心方法,帮助低本金用户在币圈中稳步前行。 精准选择,奠定基础 1、深入研究项目基本面。投资决策不…

    2025年12月10日
    000
  • 币圈小资金如何逆天改命?从一万到千万的终极指南!

    在数字货币这个充满机遇与风险的战场上,每一笔小资金都怀揣着一个惊天动地的梦想。从一万到千万,这并非天方夜谭,而是一条需要极致认知、非凡胆识与严苛纪律铺就的荆棘之路。这不单单是资本的游戏,更是一场对人性、对信息、对时机的深度博弈。想要实现这个目标,就需要一套完全不同于常规的打法和心法。 重塑认知:小资…

    2025年12月10日
    000
  • 币圈一万本金如何滚成百万?这五个步骤缺一不可!

    在数字货币的浪潮中,将一万本金变为百万,听起来像是天方夜谭,但对于掌握了正确方法论的参与者而言,这并非一个完全不可能实现的路径。这个过程充满了风险与挑战,它需要的不是一夜暴富的幻想,而是一套严谨、系统化的操作策略。这趟旅程的每一步都环环相扣,构成了从量变到质变的核心驱动力。以下五个步骤,描绘了这样一…

    2025年12月10日
    000
  • 如何在币圈用两千本金赚百万?短线狙击战法全解!

    在数字货币的浪潮中,用有限的本金实现财富的巨大增值,是许多参与者的梦想。两千本金,目标百万,这并非遥不可及的神话,它需要的是一套极致的交易纪律、敏锐的市场嗅觉和冷酷的执行力。这套方法论的核心并非长期价值投资,而是一场场高强度、快节奏的短线狙击战。 它要求交易者化身为潜伏在暗处的狙击手,放弃漫无目的的…

    2025年12月10日
    000
  • 币圈小资金如何实现百倍收益?这四大策略必须学!

    在数字货币的浪潮中,许多投资者怀揣着以小博大的梦想。小资金账户想要实现资产的跳跃式增長,并非仅凭运气。它需要一套行之有效的策略、严谨的执行纪律以及对市场深刻的理解。对于本金有限的参与者,精细化的操作和差异化的打法是通往高倍收益的必经之路。下面将详细阐述几种适用于小资金的实战策略。 一、挖掘早期潜力项…

    2025年12月10日
    000
  • 如何在币圈用三千本金赚千万?实战经验全分享!

    在数字货币这个充满机会与风险的竞技场中,用三千本金撬动千万财富的故事,听起来像是天方夜谭,但它确实在某些角落真实上演。这并非一条寻常路,它需要极致的认知、超凡的耐心、铁打的纪律以及不可或缺的运气。这里分享的不是投资建议,而是一段段在刀尖上行走的实战经验,记录了从微小本金开始,如何通过一系列操作,逐步…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信