前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 字符串比较

Go 字符串比较

作者头像
王小明_HIT
发布2022-03-28 16:01:16
1.3K0
发布2022-03-28 16:01:16
举报
文章被收录于专栏:程序员奇点程序员奇点

golang 字符串比较

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

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

  • == 比较
  • strings.Compare 比较
  • strings.EquslFold 比较
代码语言:javascript
复制

#### 代码示例
```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"))

上述代码执行结果如下:

代码语言:javascript
复制
true
false
-1
0
true
Compare 和 EqualFold 区别
  • EqualFold 是比较UTF-8编码在小写的条件下是否相等,不区分大小写
代码语言:javascript
复制
// EqualFold reports whether s and t, interpreted as UTF-8 strings, // are equal under Unicode case-folding. func EqualFold(s, t string) bool
  • 要注意的是 Compare 函数是区分大小写的, == 速度执行更快
代码语言:javascript
复制
/ 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 字符串比较是否相等

源码实现

代码语言:javascript
复制
// 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' 可以看到不区分大小写的实现。

看个完整测试代码:

代码语言:javascript
复制
// 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"))
}

执行结构

代码语言:javascript
复制
true
true

参考资料

  • https://www.geeksforgeeks.org/strings-equalfold-function-in-golang-with-examples/
  • https://cloud.tencent.com/developer/article/1651885
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • golang 字符串比较
    • Compare 和 EqualFold 区别
      • 忽略大小写比较
      • 源码实现
      • 参考资料
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档