Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Байтовый буфер
Структура Buffer
реализует байтовый буфер. Создать объект буфера можно следующими способами:
- объявить переменную с типом
Buffer
:
var buf1 bytes.Buffer
fmt.Printf("%T\n", buf1) // bytes.Buffer
buf1.Write([]byte("test"))
fmt.Printf("%q\n", buf1.Bytes()) // "test"
buf2 := bytes.Buffer{}
fmt.Printf("%T\n", buf2) // bytes.Buffer
buf2.Write([]byte("test"))
fmt.Printf("%q\n", buf2.Bytes()) // "test"
buf3 := new(bytes.Buffer)
fmt.Printf("%T\n", buf3) // *bytes.Buffer
buf3.Write([]byte("test"))
fmt.Printf("%q\n", buf3.Bytes()) // "test"
- использовать функцию
NewBuffer()
. Формат функции:
bytes.NewBuffer(buf []byte) *bytes.Buffer
Буфер становится владельцем buf
. Пример:
buf := bytes.NewBuffer([]byte("test"))
fmt.Printf("%q\n", buf.Bytes()) // "test"
- использовать функцию
NewBufferString()
. Формат функции:
bytes.NewBufferString(s string) *bytes.Buffer
Пример:
buf := bytes.NewBufferString("test")
fmt.Printf("%q\n", buf.Bytes()) // "test"
Получение содержимого буфера
Получить содержимое буфера позволяют следующие методы:
Bytes()
— возвращает слайс с непрочитанным содержимым буфера. Слайс можно использовать только до следующего изменения буфера. Формат метода:
(*bytes.Buffer).Bytes() []byte
Пример:
buf := bytes.NewBufferString("test")
fmt.Printf("%q\n", buf.Bytes()) // "test"
String()
— возвращает строку с непрочитанным содержимым буфера. Формат метода:
(*bytes.Buffer).String() string
Пример:
buf := bytes.NewBufferString("test")
fmt.Printf("%q\n", buf.String()) // "test"
Next()
— при каждом вызове возвращает следующиеn
байтов в виде слайса. Если в буфере меньшеn
байтов, то возвращается весь буфер. Если в буфере больше нет данных, то возвращается пустой слайс. Слайс можно использовать только до следующего изменения буфера. Формат метода:
(*bytes.Buffer).Next(n int) []byte
Пример:
var buf bytes.Buffer
buf.WriteString("test")
fmt.Println(buf.Next(2)) // [116 101]
fmt.Println(buf.Next(2)) // [115 116]
fmt.Println(buf.Next(2)) // []
Read()
— при каждом вызове записывает в слайсp
следующиеlen(p)
байтов. Метод возвращает два значения. Черезn
доступно число считанных байтов. Черезerr
можно получить информацию об ошибке. Если в буфере больше нет данных, то значениемerr
будетio.EOF
. Если ошибки не возникло, то значениемerr
будетnil
. Формат метода:
(*bytes.Buffer).Read(p []byte) (n int, err error)
Пример:
arr := []byte{0, 0}
var buf bytes.Buffer
buf.WriteString("test")
fmt.Println(buf.Read(arr)) // 2 <nil>
fmt.Println(arr) // [116 101]
fmt.Println(buf.Read(arr)) // 2 <nil>
fmt.Println(arr) // [115 116]
fmt.Println(buf.Read(arr)) // 0 EOF
ReadByte()
— при каждом вызове через первое возвращаемое значение доступен следующий байт. Через второе возвращаемое значение можно получить информацию об ошибке. Если в буфере больше нет данных, то значением будетio.EOF
. Если ошибки не возникло, то значением будетnil
. Формат метода:
(*bytes.Buffer).ReadByte() (byte, error)
Пример:
var buf bytes.Buffer
buf.WriteString("test")
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.ReadByte()) // 101 <nil>
fmt.Println(buf.ReadByte()) // 115 <nil>
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.ReadByte()) // 0 EOF
UnreadByte()
— отменяет чтение последнего байта. Формат метода:
(*bytes.Buffer).UnreadByte() error
Пример:
var buf bytes.Buffer
buf.WriteString("test")
fmt.Println(buf.ReadByte()) // 116 <nil>
fmt.Println(buf.UnreadByte()) // <nil>
fmt.Println(buf.ReadByte()) // 116 <nil>
ReadRune()
— при каждом вызове через первое возвращаемое значение доступен следующий символ. Через второе возвращаемое значение доступно число байтов. Через третье возвращаемое значение можно получить информацию об ошибке. Если в буфере больше нет данных, то значением будетio.EOF
. Если ошибки не возникло, то значением будетnil
. Формат метода:
(*bytes.Buffer).ReadRune() (r rune, size int, err error)
Пример:
var buf bytes.Buffer
buf.WriteString("test")
fmt.Println(buf.ReadRune()) // 116 1 <nil>
fmt.Println(buf.ReadRune()) // 101 1 <nil>
fmt.Println(buf.ReadRune()) // 115 1 <nil>
fmt.Println(buf.ReadRune()) // 116 1 <nil>
fmt.Println(buf.ReadRune()) // 0 0 EOF
UnreadRune()
— отменяет чтение последнего символа. Формат метода:
(*bytes.Buffer).UnreadRune() error
Пример:
var buf bytes.Buffer
buf.WriteString("test")
fmt.Println(buf.ReadRune()) // 116 1 <nil>
fmt.Println(buf.UnreadRune()) // <nil>
fmt.Println(buf.ReadRune()) // 116 1 <nil>
ReadBytes()
— при каждом вызове через первое возвращаемое значение доступен слайс со следующими байтами до разделителяdelim
(включая разделитель). Через второе возвращаемое значение можно получить информацию об ошибке. Если в буфере больше нет данных, то значением будетio.EOF
. Если ошибки не возникло, то значением будетnil
. Формат метода:
(*bytes.Buffer).ReadBytes(delim byte) (line []byte, err error)
Пример:
var buf bytes.Buffer
buf.WriteString("word1\nword2")
fmt.Println(buf.ReadBytes('\n')) // [119 111 114 100 49 10] <nil>
fmt.Println(buf.ReadBytes('\n')) // [119 111 114 100 50] EOF
fmt.Println(buf.ReadBytes('\n')) // [] EOF
ReadString()
— при каждом вызове через первое возвращаемое значение доступна строка со следующими байтами до разделителяdelim
(включая разделитель). Через второе возвращаемое значение можно получить информацию об ошибке. Если в буфере больше нет данных, то значением будетio.EOF
. Если ошибки не возникло, то значением будетnil
. Формат метода:
(*bytes.Buffer).ReadString(delim byte) (line string, err error)
Пример:
var buf bytes.Buffer
buf.WriteString("word1;word2")
fmt.Println(buf.ReadString(';')) // word1; <nil>
fmt.Println(buf.ReadString(';')) // word2 EOF
fmt.Println(buf.ReadString(';')) // EOF
Прочитать содержимое буфера позволяют также функции Fscan()
, Fscanln()
и Fscanf()
из пакета fmt
(описание функций приведено в разд. 14.4):
buf := bytes.NewBufferString("10 20")
x, y := 0, 0
n, err := fmt.Fscanf(buf, "%d %d", &x, &y)
fmt.Println(n, err) // 2 <nil>
fmt.Println(x, y) // 10 20
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов