cpp

Байтовый буфер

Структура 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

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp