|
Řetězec je v Go výřez bajtů určený jen pro čtení. Jazyk
i standardní knihovna zacházejí s řetězci zvláštním
způsobem - jako s kontejnery textu zakódovaného
v UTF-8.
V jiných jazycích se řetězce skládají ze “znaků”.
V Go se koncept znaku nazývá |
|
![]()
package main
|
|
import (
"fmt"
"unicode/utf8"
)
|
|
func main() {
|
|
|
|
const s = "สวัสดี"
|
|
Protože řetězce jsou ekvivalentní s |
fmt.Println("Délka:", len(s))
|
|
Indexování řetězce vrací surové hodnoty bajtů na
každém indexu. Tento cyklus vypíše hexa hodnoty všech
bajtů, které tvoří kódové body v |
for i := 0; i < len(s); i++ {
fmt.Printf("%x ", s[i])
}
fmt.Println()
|
|
Pro spočítání, kolik run je v řetězci, můžeme použít
balíček |
fmt.Println("Počet run:", utf8.RuneCountInString(s))
|
|
Cyklus |
for idx, runeValue := range s {
fmt.Printf("%#U začíná na %d\n", runeValue, idx)
}
|
|
Stejné iterace můžeme dosáhnout i explicitním
použitím funkce |
fmt.Println("\nPomocí DecodeRuneInString")
for i, w := 0, 0; i < len(s); i += w {
runeValue, width := utf8.DecodeRuneInString(s[i:])
fmt.Printf("%#U začíná na %d\n", runeValue, i)
w = width
|
|
Tohle ukazuje předání hodnoty |
examineRune(runeValue)
}
}
|
func examineRune(r rune) {
|
|
|
Hodnoty uzavřené v jednoduchých uvozovkách jsou
runové literály. Hodnotu |
if r == 't' {
fmt.Println("nalezeno tý")
} else if r == 'ส' {
fmt.Println("nalezeno so sua")
}
}
|
$ go run strings-and-runes.go
Délka: 18
e0 b8 aa e0 b8 a7 e0 b8 b1 e0 b8 aa e0 b8 94 e0 b8 b5
Počet run: 6
U+0E2A 'ส' začíná na 0
U+0E27 'ว' začíná na 3
U+0E31 'ั' začíná na 6
U+0E2A 'ส' začíná na 9
U+0E14 'ด' začíná na 12
U+0E35 'ี' začíná na 15
|
|
Pomocí DecodeRuneInString
U+0E2A 'ส' začíná na 0
nalezeno so sua
U+0E27 'ว' začíná na 3
U+0E31 'ั' začíná na 6
U+0E2A 'ส' začíná na 9
nalezeno so sua
U+0E14 'ด' začíná na 12
U+0E35 'ี' začíná na 15
|
Další příklad: Struktury (struct).