登录
首页 >  Golang >  Go问答

在Go中如何逐个字符迭代两个字符串?

来源:stackoverflow

时间:2024-02-20 22:45:28 351浏览 收藏

本篇文章向大家介绍《在Go中如何逐个字符迭代两个字符串?》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

迭代两个字符串并将它们逐个符文进行比较的惯用 go 方式是什么?

鉴于我对 go 的了解有限,执行此操作的简单方法如下所示:

arunes := []rune(astr)
brunes := []rune(bstr)
for i, a := range arunes {
  b := brunes[i]
  // do something with a and b
}

astrbstr 很短或无论如何都需要完整扫描时,这可以正常工作,但是当它们很长并且很可能提前中断循环时,这可能效率低下,因为根据我的理解,[] rune(..) 需要对字符串进行完整扫描。特别是,如果字符串很长,而我只需要查看,例如两个字符串的前 1%,我想避免扫描整个字符串。

(我的第一个想法是某种 zip,但据我所知,这在 go 中不存在,并且由于缺乏泛型,函数签名无论如何看起来都非常恶心 - 但如果 go 确实有一个好的zip 的干净替代品,我会非常高兴和兴奋地了解它)

tl;dr 有没有一种惯用的 go 方法来迭代字符串对中的符文,同时在只需要查看两个字符串的一小部分时仍然保持高效?


正确答案


使用 utf8.DecodeRuneInString 从每个字符串中获取符文。

s1 := "hello world"
s2 := "Hello, 世界"
for {
    r1, n1 := utf8.DecodeRuneInString(s1)
    r2, n2 := utf8.DecodeRuneInString(s2)

    // DeocdeRuneInString returns a zero size rune
    // at the end of the string. I break the loop
    // here when the end of a string is reached. Update
    // the logic as appropriate for your application.
    if n1 == 0 || n2 == 0 {
        break
    }

    // Process the runes.
    fmt.Printf("%c %c\n", r1, r2)

    // Advance to next rune.
    s1 = s1[n1:]
    s2 = s2[n2:]
}

Run the example on the playground

今天关于《在Go中如何逐个字符迭代两个字符串?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>