簡單介紹Go 字串比較的實現示例

roc_guo發表於2022-02-11

字串比較, 可以直接使用 == 進行比較, 也可用用 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
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 字串比較的實現示例的文章就介紹到這了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2855247/,如需轉載,請註明出處,否則將追究法律責任。

相關文章