So vergleichen Sie Zeichenfolgen in der Go-Sprache

青灯夜游
Freigeben: 2023-01-14 13:06:28
Original
4752 Leute haben es durchsucht
<blockquote><p>Vergleichsmethode: 1. Verwenden Sie zum Vergleichen direkt den Operator „==“, die Syntax lautet „str1 == str2“, bei dieser Methode wird die Groß-/Kleinschreibung beachtet. 2. Verwenden Sie zum Vergleichen die Funktion Compare () des Strings-Pakets mit der Syntax „strings.Compare(a,b)“. Der Rückgabewert ist vom Typ int. 0 bedeutet, dass die beiden Zahlen gleich sind, 1 bedeutet, dass a größer ist als b und „-1“ bedeutet, dass a kleiner als b ist. 3. Verwenden Sie den EqualFold()-Vergleich des Strings-Pakets. Die Syntax lautet „strings.EqualFold(a,b)“. </p></blockquote> <p><img src="https://img.php.cn/upload/article/000/000/024/63c224119dee6813.jpg" alt="So vergleichen Sie Zeichenfolgen in der Go-Sprache" ></p> <p>Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer. </p> <h2><strong>String-Vergleichsmethoden in der Go-Sprache</strong></h2> <p>Es gibt drei Möglichkeiten, Strings in der Go-Sprache zu vergleichen: </p> <ul class="ul-level-0"> <li> <code>==</code> Direkter Vergleich, Groß-/Kleinschreibung beachten</li> <code>==</code> 直接比较,区分大小写<li> <code>strings.Compare(a,b)</code> 该函数返回值为 int, 0 表示两数相等,1 表示 a>b, -1 表示 a<b><li> <code>strings.EqualFold(a,b)</code> 直接返回是否相等,不区分大小写。</li></b> </li> </ul> <p>示例如下:<span style="background-color: rgb(248, 248, 248);">// 1-使用等号比较——区分大消息</span></p> <div class="developer-code-block"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">func Equal(s1, s2 string) bool { return s1 == s2 } // 2-使用 compare 比较——区分大小写 func Compare(s1, s2 string) bool { return strings.Compare(s1, s2) == 0 // } //3-EqualFold 比较——不区分大小写. case-fold 即大小写同一处理 func EqualFold(s1, s2 string) bool { return strings.EqualFold(s1, s2) } // 使用等号比较——忽略大小写 func Equal2(s1, s2 string) bool { return strings.ToLower(s1) == strings.ToLower(s2) } // 使用 compare 比较——不区分大小写 func Compare2(s1, s2 string) bool { return strings.Compare(strings.ToLower(s1), strings.ToLower(s2)) == 0 } func StringCompareTest() { fmt.Println("== 区分大小写", Equal("go", "Go")) //false fmt.Println("== 忽略大小写",Equal2("go", "Go")) //true fmt.Println("compare 区分大小写",Compare("go", "Go")) //false fmt.Println("compare 忽略大小写",Compare2("go", "Go")) //true fmt.Println("EqualFold 忽略大小写",EqualFold("go", "Go")) // true }</pre><div class="contentsignin">Nach dem Login kopieren</div></div></div><h2><strong>性能比较</strong></h2><p>下面的代码使用 Benchmark 做简单的性能比较,测试项目的目录结构为:</p><p><img src="https://img.php.cn/upload/image/916/800/564/167367265364778So vergleichen Sie Zeichenfolgen in der Go-Sprache" title="167367265364778So vergleichen Sie Zeichenfolgen in der Go-Sprache" alt="So vergleichen Sie Zeichenfolgen in der Go-Sprache"/></p><p>详细代码:</p><div class="developer-code-block"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">package test import ( "../str" "testing" ) func BenchmarkStrEqual(b *testing.B) { for i := 0; i < b.N; i++ { str.Equal("go", "Go") } } func BenchmarkStrEqual2(b *testing.B) { for i := 0; i < b.N; i++ { str.Equal2("go", "Go") } } func BenchmarkStrCompare(b *testing.B) { for i := 0; i < b.N; i++ { str.Compare("go", "Go") } } func BenchmarkStrCompare2(b *testing.B) { for i := 0; i < b.N; i++ { str.Compare2("go", "Go") } } func BenchmarkStrEqualFold(b *testing.B) { for i := 0; i < b.N; i++ { str.EqualFold("go", "Go") } }</pre><div class="contentsignin">Nach dem Login kopieren</div></div></div><p>测试结果如下:</p><p><img src="https://img.php.cn/upload/image/725/103/124/1673672666716944.png" title="1673672666716944.png" alt="So vergleichen Sie Zeichenfolgen in der Go-Sprache"/></p><p>通过上图可以看出,效率最高的还是 ==</p><h2><strong>源码简单分析</strong></h2><h4 id="3.1-strings.Compare" name="3.1-strings.Compare"><strong>1、strings.Compare</strong></h4><div class="developer-code-block"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">package strings // Compare returns an integer comparing two strings lexicographically. // The result will be 0 if a==b, -1 if a < b, and +1 if a > b. // // 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 { // NOTE(rsc): This function does NOT call the runtime cmpstring function, // because we do not want to provide any performance justification for // using strings.Compare. Basically no one should use strings.Compare. // As the comment above says, it is here only for symmetry with package bytes. // If performance is important, the compiler should be changed to recognize // the pattern so that all code doing three-way comparisons, not just code // using strings.Compare, can benefit. if a == b { return 0 } if a < b { return -1 } return +1 }</pre><div class="contentsignin">Nach dem Login kopieren</div></div></div><p>如上所示,我们发现,Compare 内部也是调用了 <code>==</code> , 而且该函数的注释中也说了,这个函数 only for symmetry with package bytes。而且推荐我们直接使用 <code>==</code> 和 <code>></code>、<code><</code>。</p><h4 id="3.2-strings.EqualFold" name="3.2-strings.EqualFold"><strong>2、strings.EqualFold</strong></h4><div class="developer-code-block"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">// 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 &#39;A&#39; <= sr && sr <= &#39;Z&#39; && tr == sr+&#39;a&#39;-&#39;A&#39; { 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 }</pre><div class="contentsignin">Nach dem Login kopieren</div></div></div> <p>这个函数中做了一系列操作,将两个字符串转换成 <code>utf-8</code>Strings .Compare(a,b) Der Rückgabewert dieser Funktion ist int, 0 bedeutet, dass die beiden Zahlen gleich sind, 1 bedeutet a>b, -1 bedeutet a<b. gro und kleinschreibung beachten></b.></p> <code>strings.EqualFold(a,b)</code> Gibt direkt zurück, ob sie gleich sind, ohne Groß- und Kleinschreibung. <h2>Das Beispiel sieht wie folgt aus: <span style="background-color: rgb(248, 248, 248);">// 1-Gleichheitszeichenvergleich verwenden – große Nachrichten unterscheiden</span><strong> <div class="developer-code-block">rrreee</div></strong> </h2>Leistungsvergleich<p></p> <p>Der folgende Code verwendet Benchmark, um einen einfachen Leistungsvergleich durchzuführen. Die Verzeichnisstruktur des Testprojekts ist:<a href="http://www.php.cn/course/list/44.html" target="_blank"></a><a href="https://www.php.cn/course.html" target="_blank" textvalue="编程教学"></a>Detaillierter Code: </p> <div class=" Developer-Code-Block">rrreee</div>🎜Die Testergebnisse sind wie folgt: 🎜🎜<img src="https://img.php.cn/upload/image/725/103/%20124/1673672666716944.png" title="1673672666716944.png" alt="So vergleichen Sie Zeichenfolgen in der Go-Sprache">🎜🎜Wie Sie auf dem Bild oben sehen können, ist die effizienteste ==🎜🎜🎜einfache Analyse des Quellcodes🎜 🎜<h4 id="3.1-strings.Compare" name="3.1-strings.Compare">🎜1, strings.Compare🎜</h4> <div class="developer-code-block">rrreee</div> 🎜Wie oben gezeigt, haben wir festgestellt, dass Compare auch intern aufgerufen wird== , und der Kommentar dieser Funktion besagt auch, dass diese Funktion nur für die Symmetrie mit Paketbytes dient. Und es wird empfohlen, dass wir <code>==</code> und <code>></code>, <code> direkt verwenden. 🎜<h4 id="3.2-strings.EqualFold" name="3.2-strings.EqualFold">🎜2, strings.EqualFold🎜</h4> <div class="developer-code-block">rrreee</div> 🎜Diese Funktion führt eine Reihe von Vorgängen aus, um zwei Zeichenfolgen zum Vergleich in <code>utf-8</code>-Zeichenfolgen umzuwandeln, und ignoriert beim Vergleich die Groß-/Kleinschreibung. 🎜🎜🎜Zusammenfassung🎜🎜🎜Durch die obige einfache Zusammenfassung und Analyse haben wir herausgefunden, dass es für den String-Vergleich besser ist, direkt die Vergleichsoperatoren ==, >, </code>

Das obige ist der detaillierte Inhalt vonSo vergleichen Sie Zeichenfolgen in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage