Метод bufio.Reader.ReadRune
Метод ReadRune типа bufio.Reader читает один символ Unicode (руну) из буферизированного потока данных. В отличие от методов чтения байтов, он корректно обрабатывает многобайтовые символы UTF-8. Метод возвращает три значения: прочитанную руну, количество байт, которые она занимает в кодировке UTF-8, и ошибку. Если чтение выполнено успешно, ошибка будет равна nil.
Синтаксис
func (b *bufio.Reader) ReadRune() (r rune, size int, err error)
Пример
Давайте прочитаем первый символ из строки "Привет":
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
s := "Привет"
reader := bufio.NewReader(strings.NewReader(s))
r, size, err := reader.ReadRune()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Символ: %c, байт: %d\n", r, size)
}
Результат выполнения кода:
"Символ: П, байт: 2"
В этом примере метод правильно определил, что символ "П" занимает 2 байта в UTF-8.
Пример
Давайте прочитаем несколько символов из строки "Hello":
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
s := "Hello"
reader := bufio.NewReader(strings.NewReader(s))
for i := 0; i < 3; i++ {
r, size, err := reader.ReadRune()
if err != nil {
fmt.Println("Error:", err)
break
}
fmt.Printf("Символ %d: %c, байт: %d\n", i+1, r, size)
}
}
Результат выполнения кода:
"Символ 1: H, байт: 1"
"Символ 2: e, байт: 1"
"Символ 3: l, байт: 1"
В этом примере все символы английского алфавита занимают по 1 байту.
Пример
Давайте прочитаем символы из строки "🔤ABC" и обработаем возможные ошибки:
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
s := "🔤ABC"
reader := bufio.NewReader(strings.NewReader(s))
for {
r, size, err := reader.ReadRune()
if err != nil {
fmt.Println("End of input or error:", err)
break
}
fmt.Printf("Символ: %c, байт: %d\n", r, size)
}
}
Результат выполнения кода:
"Символ: 🔤, байт: 4"
"Символ: A, байт: 1"
"Символ: B, байт: 1"
"Символ: C, байт: 1"
"End of input or error: EOF"
В этом примере эмодзи занимает 4 байта, а буквы английского алфавита по 1 байту. Когда метод достигает конца потока, он возвращает ошибку io.EOF.
Смотрите также
-
метод
bufio.Reader.ReadByte,
который читает один байт из потока -
метод
bufio.Reader.ReadString,
который читает строку до заданного разделителя -
метод
bufio.Reader.ReadBytes,
который читает байты до заданного разделителя -
метод
bufio.Reader.ReadLine,
который читает одну строку из потока