日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go?字符串比較的實現示例_Golang

作者:banjming ? 更新時間: 2022-04-06 編程語言

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

原文鏈接:https://juejin.cn/post/7032887851066851342

欄目分類
最近更新