阅读 497

Go 字符串比较(go字符串比较大小)

golang 字符串比较

字符串比较, 可以直接使用 == 进行比较, 也可用用 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


作者:banjming
链接:https://juejin.cn/post/7032887851066851342


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐