当前位置:首页 > 谈天说地

Go 字符串比较的实现示例

34资源网2022-01-24638
目录
  • compare 和 equalfold 区别
  • 忽略大小写比较

字符串比较, 可以直接使用 == 进行比较, 也可用用 strings.compare 比较

go 中字符串比较有三种方式:

  • == 比较
  • strings.compare 比较
  • strings.equslfold 比较
#### 代码示例
```go
fmt.println("go"=="go")
fmt.println("go"=="go")

fmt.println(strings.compare("go","go"))
fmt.println(strings.compare("go","go"))

fmt.println(strings.equalfold("go","go"))

上述代码执行结果如下:

true
false
-1
0
true

compare 和 equalfold 区别

equalfold 是比较utf-8编码在小写的条件下是否相等,不区分大小写

// equalfold reports whether s and t, interpreted as utf-8 strings, // are equal under unicode case-folding. func equalfold(s, t string) bool

要注意的是 compare 函数是区分大小写的, == 速度执行更快

// compare is included only for symmetry with package bytes. // it is usually clearer and always faster to use the built-in // string comparison operators ==, <, >, and so on. func compare(a, b string) int

忽略大小写比较

有时候要忽略大小写比较, 可以使用strings.equalfold 字符串比较是否相等
源码实现

// equalfold reports whether s and t, interpreted as utf-8 strings,
// are equal under unicode case-folding, which is a more general
// form of case-insensitivity.
func equalfold(s, t string) bool {
    for s != "" && t != "" {
        // extract first rune from each string.
        var sr, tr rune
        if s[0] < utf8.runeself {
            sr, s = rune(s[0]), s[1:]
        } else {
            r, size := utf8.decoderuneinstring(s)
            sr, s = r, s[size:]
        }
        if t[0] < utf8.runeself {
            tr, t = rune(t[0]), t[1:]
        } else {
            r, size := utf8.decoderuneinstring(t)
            tr, t = r, t[size:]
        }

        // if they match, keep going; if not, return false.

        // easy case.
        if tr == sr {
            continue
        }

        // make sr < tr to simplify what follows.
        if tr < sr {
            tr, sr = sr, tr
        }
        // fast check for ascii.
        if tr < utf8.runeself {
            // ascii only, sr/tr must be upper/lower case
            if 'a' <= sr && sr <= 'z' && tr == sr+'a'-'a' {
                continue
            }
            return false
        }

        // general case. simplefold(x) returns the next equivalent rune > x
        // or wraps around to smaller values.
        r := unicode.simplefold(sr)
        for r != sr && r < tr {
            r = unicode.simplefold(r)
        }
        if r == tr {
            continue
        }
        return false
    }

    // one string is empty. are both?
    return s == t
}

通过源码可看到 if 'a' <= sr && sr <= 'z' && tr == sr+'a'-'a'  可以看到不区分大小写的实现。
看个完整测试代码:

// golang program to illustrate the
// strings.equalfold() function
package main

// importing fmt and strings
import (
    "fmt"
    "strings"
)

// calling main method
func main() {
    // case insensitive comparing and returns true.
    fmt.println(strings.equalfold("geeks", "geeks"))

    // case insensitive comparing and returns true.
    fmt.println(strings.equalfold("computerscience", "computerscience"))
}

执行结构
true
true

 到此这篇关于go 字符串比较的实现示例的文章就介绍到这了,更多相关go 字符串比较内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

版权声明:34楼发布

本文链接:https://www.34l.com/post/6240.html

分享给朋友:

相关文章

华为p40pro参数配置(p40与p40pro参数对比)

华为p40pro参数配置(p40与p40pro参数对比)

据网友反馈,华为 P40/Pro 系列开始推送鸿蒙 HarmonyOS2.0.0.1 66 (C00E160R3P6),大小 1.26 GB。 IT之家获悉,本次更新相机将新增多机位拍摄模式,通过变换机位拍摄,获得镜头更丰富的精彩视频和照…

联想乐pad平板电脑有哪些版本(平板电脑排行榜性价比)

联想乐pad平板电脑有哪些版本(平板电脑排行榜性价比)

对于安卓平板电脑行业而言,创新相对来说比较困难。一方面,安卓系统的功能早已经被各方挖掘殆尽;另一方面,从整个平板电脑行业大环境来看,iPad阵营坚固的护城河也影响着安卓阵营的创新欲望。再加上时下热衷于投身平板电脑行业的品牌本来就不像以往那么…

董明珠还需要几个网红?

董明珠还需要几个网红?

编者按:本文来自科技新知,创业邦经授权发布。 作者丨李哩哩 编辑丨月见 一个网红,就是一个渠道。八个网红,就是八个渠道。 董明珠应该进一步向罗永浩看齐。 12月1日,交个朋友直播间发布了名为“交个朋友宇宙”的文章,文章介绍罗永浩“交…

飞行汽车是一种应用层创新

飞行汽车是一种应用层创新

编者按:本文来自A轮财经,创业邦经授权发布。 作者|WX 今天在全球范围内,飞行汽车得到了越来越多的关注。 据摩根士丹利研报预计,2030年飞行汽车行业将形成3000亿美元的市场规模。2040年,该行业规模可能将达到1.5万亿美元。 作为新…

B站、爱奇艺:这对难兄难弟

11月17日,哔哩哔哩(下称“B站”)与爱奇艺发布截至2021年9月30日的第三季度财报。B站Q3营收52.066亿元,同比增长61%,净亏损26.863亿元;爱奇艺Q3营收75.891亿元,同比增长6%,净亏损16.984亿元。 两家先后…