( Ich hatte das Gefühl, dass die obigen Antworten die Unterschiede und Beziehungen zwischen string
und immer noch nicht []rune
sehr deutlich darstellten, daher würde ich versuchen, eine weitere Antwort mit Beispiel hinzuzufügen.)
Wie @Strangework
die Antwort sagte, string
und []rune
sind ganz anders.
Unterschiede - string
& []rune
:
string value
ist ein schreibgeschütztes Byte-Slice. Und ein Zeichenfolgenliteral ist in utf-8 codiert. Jedes Zeichen in string
tatsächlich nimmt 1 ~ 3 Bytes, während jeder rune
dauert 4 Bytes
- Denn
string
sowohl len()
als auch der Index basieren auf Bytes.
- Denn
[]rune
sowohl len()
als auch der Index basieren auf Rune (oder Int32).
Beziehungen - string
& []rune
:
- Wenn Sie von
string
nach konvertieren , []rune
wird jedes utf-8-Zeichen in dieser Zeichenfolge zu a rune
.
- In ähnlicher Weise wird bei der umgekehrten Konvertierung bei der Konvertierung von
[]rune
nach string
jedes rune
ein utf-8-Zeichen in der string
.
Tipps:
- Sie können zwischen
string
und konvertieren []rune
, aber sie unterscheiden sich in Typ und Gesamtgröße.
(Ich würde ein Beispiel hinzufügen, um dies deutlicher zu zeigen.)
Code
string_rune_compare.go:
// string & rune compare,
package main
import "fmt"
// string & rune compare,
func stringAndRuneCompare() {
// string,
s := "hello你好"
fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
li := len(s) - 1 // last index,
fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])
// []rune
rs := []rune(s)
fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}
func main() {
stringAndRuneCompare()
}
Ausführen:
Führen Sie string_rune_compare.go aus
Ausgabe:
hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8
[104 101 108 108 111 20320 22909], type: []int32, len: 7
Erläuterung:
Die Zeichenfolge hello你好
hat die Länge 11, da die ersten 5 Zeichen jeweils nur 1 Byte benötigen, während die letzten 2 chinesischen Zeichen jeweils 3 Byte benötigen.
- So,
total bytes = 5 * 1 + 2 * 3 = 11
- Da
len()
on string auf Bytes basiert, wird somit die erste Zeile gedrucktlen: 11
- Da der Index für eine Zeichenfolge ebenfalls auf Bytes basiert, geben die folgenden 2 Zeilen Werte vom Typ aus
uint8
(da byte
es sich um einen Alias-Typ von uint8
, in go handelt).
Bei der Konvertierung string
nach []rune
wurden 7 utf8-Zeichen gefunden, also 7 Runen.
- Da
len()
on []rune
auf Rune basiert, wird somit die letzte Zeile gedruckt len: 7
.
- Wenn Sie
[]rune
über Index arbeiten, greift es auf Basis der Rune zu.
Da jede Rune von einem utf8-Zeichen in der ursprünglichen Zeichenfolge stammt, können Sie auch sagen, dass beide len()
und []rune
die Indexoperation auf utf8-Zeichen basieren.