Пакет bytes
Обзор
Пакет bytes реализует функции для работы с байтовыми срезами. Он аналогичен возможностям пакета strings.
Указатель
Примеры
- Buffer
- Buffer.AvailableBuffer
- Buffer.Bytes
- Buffer.Cap
- Buffer.Grow
- Buffer.Len
- Buffer.Next
- Buffer.Read
- Buffer.ReadByte
- Buffer (Reader)
- Clone
- Compare
- Compare (Search)
- Contains
- ContainsAny
- ContainsFunc
- ContainsRune
- Count
- Cut
- CutPrefix
- CutSuffix
- Equal
- EqualFold
- Fields
- FieldsFunc
- FieldsFuncSeq
- FieldsSeq
- HasPrefix
- HasSuffix
- Index
- IndexAny
- IndexByte
- IndexFunc
- IndexRune
- Join
- LastIndex
- LastIndexAny
- LastIndexByte
- LastIndexFunc
- Lines
- Map
- Reader.Len
- Repeat
- Replace
- ReplaceAll
- Runes
- Split
- SplitAfter
- SplitAfterN
- SplitAfterSeq
- SplitN
- SplitSeq
- Title
- ToLower
- ToLowerSpecial
- ToTitle
- ToTitleSpecial
- ToUpper
- ToUpperSpecial
- ToValidUTF8
- Trim
- TrimFunc
- TrimLeft
- TrimLeftFunc
- TrimPrefix
- TrimRight
- TrimRightFunc
- TrimSpace
- TrimSuffix
Файлы пакета
buffer.go bytes.go iter.go reader.go
Константы
MinRead — минимальный размер среза, передаваемого вызову Buffer.Read функцией Buffer.ReadFrom. Пока у Buffer есть как минимум MinRead байт сверх объёма, необходимого для хранения содержимого r, функция Buffer.ReadFrom не будет увеличивать базовый буфер.
const MinRead = 512
Переменные
ErrTooLarge передаётся в panic, если не удаётся выделить память для хранения данных в буфере.
var ErrTooLarge = errors.New("bytes.Buffer: too large") func Clone 1.20
func Clone(b []byte) []byte
Clone возвращает копию b[:len(b)]. У результата может быть дополнительная неиспользуемая ёмкость. Clone(nil) возвращает nil.
Пример
Код:
b := []byte("abc")
clone := bytes.Clone(b)
fmt.Printf("%s\n", clone)
clone[0] = 'd'
fmt.Printf("%s\n", b)
fmt.Printf("%s\n", clone)
Вывод:
abc abc dbc
func Compare
func Compare(a, b []byte) int
Compare возвращает целое число, сравнивающее два байтовых среза лексикографически. Результат равен 0, если a == b, -1, если a < b, и +1, если a > b. Аргумент nil эквивалентен пустому срезу.
Пример
Код:
// Interpret Compare's result by comparing it to zero.
var a, b []byte
if bytes.Compare(a, b) < 0 {
// a less b
}
if bytes.Compare(a, b) <= 0 {
// a less or equal b
}
if bytes.Compare(a, b) > 0 {
// a greater b
}
if bytes.Compare(a, b) >= 0 {
// a greater or equal b
}
// Prefer Equal to Compare for equality comparisons.
if bytes.Equal(a, b) {
// a equal b
}
if !bytes.Equal(a, b) {
// a not equal b
}
Пример (поиск)
Код:
// Binary search to find a matching byte slice.
var needle []byte
var haystack [][]byte // Assume sorted
_, found := slices.BinarySearchFunc(haystack, needle, bytes.Compare)
if found {
// Found it!
}
func Contains
func Contains(b, subslice []byte) bool
Contains сообщает, содержится ли подсрез в b.
Пример
Код:
fmt.Println(bytes.Contains([]byte("seafood"), []byte("foo")))
fmt.Println(bytes.Contains([]byte("seafood"), []byte("bar")))
fmt.Println(bytes.Contains([]byte("seafood"), []byte("")))
fmt.Println(bytes.Contains([]byte(""), []byte("")))
Вывод:
true false true true
func ContainsAny 1.7
func ContainsAny(b []byte, chars string) bool
ContainsAny сообщает, содержится ли в b хотя бы одна из кодовых точек chars, закодированных в UTF-8.
Пример
Код:
fmt.Println(bytes.ContainsAny([]byte("I like seafood."), "fÄo!"))
fmt.Println(bytes.ContainsAny([]byte("I like seafood."), "去是伟大的."))
fmt.Println(bytes.ContainsAny([]byte("I like seafood."), ""))
fmt.Println(bytes.ContainsAny([]byte(""), ""))
Вывод:
true true false false
func ContainsFunc 1.21
func ContainsFunc(b []byte, f func(rune) bool) bool
ContainsFunc сообщает, удовлетворяет ли хотя бы одна из кодовых точек r, закодированных в UTF-8 и содержащихся в b, условию f(r). Функция останавливается, как только вызов f возвращает true.
Пример
Код:
f := func(r rune) bool {
return r >= 'a' && r <= 'z'
}
fmt.Println(bytes.ContainsFunc([]byte("HELLO"), f))
fmt.Println(bytes.ContainsFunc([]byte("World"), f))
Вывод:
false true
func ContainsRune 1.7
func ContainsRune(b []byte, r rune) bool
ContainsRune сообщает, содержится ли руна в байтовом срезе b, закодированном в UTF-8.
Пример
Код:
fmt.Println(bytes.ContainsRune([]byte("I like seafood."), 'f'))
fmt.Println(bytes.ContainsRune([]byte("I like seafood."), 'ö'))
fmt.Println(bytes.ContainsRune([]byte("去是伟大的!"), '大'))
fmt.Println(bytes.ContainsRune([]byte("去是伟大的!"), '!'))
fmt.Println(bytes.ContainsRune([]byte(""), '@'))
Вывод:
true false true true false
func Count
func Count(s, sep []byte) int
Count подсчитывает количество неперекрывающихся вхождений sep в s. Если sep — пустой срез, Count возвращает 1 + количество кодовых точек в s, закодированных в UTF-8.
Пример
Код:
fmt.Println(bytes.Count([]byte("cheese"), []byte("e")))
fmt.Println(bytes.Count([]byte("five"), []byte(""))) // before & after each rune
Вывод:
3 5
func Cut 1.18
func Cut(s, sep []byte) (before, after []byte, found bool)
Cut разделяет s вокруг первого вхождения sep и возвращает текст до и после sep. Результат found указывает, встречается ли sep в s. Если sep не встречается в s, Cut возвращает s, nil, false.
Cut возвращает срезы исходного среза s, а не копии.
Пример
Код:
show := func(s, sep string) {
before, after, found := bytes.Cut([]byte(s), []byte(sep))
fmt.Printf("Cut(%q, %q) = %q, %q, %v\n", s, sep, before, after, found)
}
show("Gopher", "Go")
show("Gopher", "ph")
show("Gopher", "er")
show("Gopher", "Badger")
Вывод:
Cut("Gopher", "Go") = "", "pher", true
Cut("Gopher", "ph") = "Go", "er", true
Cut("Gopher", "er") = "Goph", "", true
Cut("Gopher", "Badger") = "Gopher", "", false
func CutLast 1.27
func CutLast(s, sep []byte) (before, after []byte, found bool)
CutLast разделяет s вокруг последнего вхождения sep и возвращает текст до и после sep. Результат found указывает, встречается ли sep в s. Если sep не встречается в s, CutLast возвращает s, nil, false.
CutLast возвращает срезы исходного среза s, а не копии.
func CutPrefix 1.20
func CutPrefix(s, prefix []byte) (after []byte, found bool)
CutPrefix возвращает s без указанного начального байтового среза prefix и сообщает, найден ли этот префикс. Если s не начинается с prefix, CutPrefix возвращает s, false. Если prefix — пустой байтовый срез, CutPrefix возвращает s, true.
CutPrefix возвращает срезы исходного среза s, а не копии.
Пример
Код:
show := func(s, prefix string) {
after, found := bytes.CutPrefix([]byte(s), []byte(prefix))
fmt.Printf("CutPrefix(%q, %q) = %q, %v\n", s, prefix, after, found)
}
show("Gopher", "Go")
show("Gopher", "ph")
Вывод:
CutPrefix("Gopher", "Go") = "pher", true
CutPrefix("Gopher", "ph") = "Gopher", false
func CutSuffix 1.20
func CutSuffix(s, suffix []byte) (before []byte, found bool)
CutSuffix возвращает s без указанного конечного байтового среза suffix и сообщает, найден ли этот суффикс. Если s не заканчивается на suffix, CutSuffix возвращает s, false. Если suffix — пустой байтовый срез, CutSuffix возвращает s, true.
CutSuffix возвращает срезы исходного среза s, а не копии.
Пример
Код:
show := func(s, suffix string) {
before, found := bytes.CutSuffix([]byte(s), []byte(suffix))
fmt.Printf("CutSuffix(%q, %q) = %q, %v\n", s, suffix, before, found)
}
show("Gopher", "Go")
show("Gopher", "er")
Вывод:
CutSuffix("Gopher", "Go") = "Gopher", false
CutSuffix("Gopher", "er") = "Goph", true
func Equal
func Equal(a, b []byte) bool
Equal сообщает, имеют ли a и b одинаковую длину и содержат ли одинаковые байты. Аргумент nil эквивалентен пустому срезу.
Пример
Код:
fmt.Println(bytes.Equal([]byte("Go"), []byte("Go")))
fmt.Println(bytes.Equal([]byte("Go"), []byte("C++")))
Вывод:
true false
func EqualFold
func EqualFold(s, t []byte) bool
EqualFold сообщает, равны ли s и t, рассматриваемые как строки в кодировке UTF-8, с учётом простого Unicode-преобразования регистра, которое представляет собой более общий вариант сравнения без учёта регистра.
Пример
Код:
fmt.Println(bytes.EqualFold([]byte("Go"), []byte("go")))
Вывод:
true
func Fields
func Fields(s []byte) [][]byte
Fields рассматривает s как последовательность кодовых точек, закодированных в UTF-8. Функция разделяет срез s по каждому вхождению одной или нескольких подряд идущих пробельных символов, определяемых функцией unicode.IsSpace, и возвращает срез подсрезов s или пустой срез, если s содержит только пробельные символы. Каждый элемент возвращённого среза непустой. В отличие от Split, начальные и конечные последовательности пробельных символов отбрасываются.
Пример
Код:
fmt.Printf("Fields are: %q", bytes.Fields([]byte(" foo bar baz ")))
Вывод:
Fields are: ["foo" "bar" "baz"]
func FieldsFunc
func FieldsFunc(s []byte, f func(rune) bool) [][]byte
FieldsFunc рассматривает s как последовательность кодовых точек, закодированных в UTF-8. Функция разделяет срез s в каждой последовательности кодовых точек c, удовлетворяющих условию f(c), и возвращает срез подсрезов s. Если все кодовые точки в s удовлетворяют условию f(c) или len(s) == 0, возвращается пустой срез. Каждый элемент возвращённого среза непустой. В отличие от Split, начальные и конечные последовательности кодовых точек, удовлетворяющих условию f(c), отбрасываются.
FieldsFunc не гарантирует порядок вызова f(c) и предполагает, что f всегда возвращает одно и то же значение для заданного c.
Пример
Код:
f := func(c rune) bool {
return !unicode.IsLetter(c) && !unicode.IsNumber(c)
}
fmt.Printf("Fields are: %q", bytes.FieldsFunc([]byte(" foo1;bar2,baz3..."), f))
Вывод:
Fields are: ["foo1" "bar2" "baz3"]
func FieldsFuncSeq 1.24
func FieldsFuncSeq(s []byte, f func(rune) bool) iter.Seq[[]byte]
FieldsFuncSeq возвращает итератор по подсрезам s, разделённым последовательностями кодовых точек Unicode, удовлетворяющих условию f(c). Итератор выдаёт те же подсрезы, что и FieldsFunc(s), но не создаёт новый срез, содержащий эти подсрезы.
Пример
Код:
text := []byte("The quick brown fox")
fmt.Println("Split on whitespace(similar to FieldsSeq):")
for word := range bytes.FieldsFuncSeq(text, unicode.IsSpace) {
fmt.Printf("%q\n", word)
}
mixedText := []byte("abc123def456ghi")
fmt.Println("\nSplit on digits:")
for word := range bytes.FieldsFuncSeq(mixedText, unicode.IsDigit) {
fmt.Printf("%q\n", word)
}
Вывод:
Split on whitespace(similar to FieldsSeq): "The" "quick" "brown" "fox" Split on digits: "abc" "def" "ghi"
func FieldsSeq 1.24
func FieldsSeq(s []byte) iter.Seq[[]byte]
FieldsSeq возвращает итератор по подсрезам s, разделённым последовательностями пробельных символов, определяемых функцией unicode.IsSpace. Итератор выдаёт те же подсрезы, что и Fields(s), но не создаёт новый срез, содержащий эти подсрезы.
Пример
Код:
text := []byte("The quick brown fox")
fmt.Println("Split byte slice into fields:")
for word := range bytes.FieldsSeq(text) {
fmt.Printf("%q\n", word)
}
textWithSpaces := []byte(" lots of spaces ")
fmt.Println("\nSplit byte slice with multiple spaces:")
for word := range bytes.FieldsSeq(textWithSpaces) {
fmt.Printf("%q\n", word)
}
Вывод:
Split byte slice into fields: "The" "quick" "brown" "fox" Split byte slice with multiple spaces: "lots" "of" "spaces"
func HasPrefix
func HasPrefix(s, prefix []byte) bool
HasPrefix сообщает, начинается ли байтовый срез s с prefix.
Пример
Код:
fmt.Println(bytes.HasPrefix([]byte("Gopher"), []byte("Go")))
fmt.Println(bytes.HasPrefix([]byte("Gopher"), []byte("C")))
fmt.Println(bytes.HasPrefix([]byte("Gopher"), []byte("")))
Вывод:
true false true
func HasSuffix
func HasSuffix(s, suffix []byte) bool
HasSuffix сообщает, заканчивается ли байтовый срез s на suffix.
Пример
Код:
fmt.Println(bytes.HasSuffix([]byte("Amigo"), []byte("go")))
fmt.Println(bytes.HasSuffix([]byte("Amigo"), []byte("O")))
fmt.Println(bytes.HasSuffix([]byte("Amigo"), []byte("Ami")))
fmt.Println(bytes.HasSuffix([]byte("Amigo"), []byte("")))
Вывод:
true false false true
func Index
func Index(s, sep []byte) int
Index возвращает индекс первого вхождения sep в s или -1, если sep отсутствует в s.
Пример
Код:
fmt.Println(bytes.Index([]byte("chicken"), []byte("ken")))
fmt.Println(bytes.Index([]byte("chicken"), []byte("dmr")))
Вывод:
4 -1
func IndexAny
func IndexAny(s []byte, chars string) int
IndexAny рассматривает s как последовательность кодовых точек Unicode, закодированных в UTF-8. Функция возвращает байтовый индекс первого вхождения в s любой из кодовых точек Unicode из chars. Возвращается -1, если chars пуст или если нет общих кодовых точек.
Пример
Код:
fmt.Println(bytes.IndexAny([]byte("chicken"), "aeiouy"))
fmt.Println(bytes.IndexAny([]byte("crwth"), "aeiouy"))
Вывод:
2 -1
func IndexByte
func IndexByte(b []byte, c byte) int
IndexByte возвращает индекс первого вхождения c в b или -1, если c отсутствует в b.
Пример
Код:
fmt.Println(bytes.IndexByte([]byte("chicken"), byte('k')))
fmt.Println(bytes.IndexByte([]byte("chicken"), byte('g')))
Вывод:
4 -1
func IndexFunc
func IndexFunc(s []byte, f func(r rune) bool) int
IndexFunc рассматривает s как последовательность кодовых точек, закодированных в UTF-8. Функция возвращает байтовый индекс в s первой кодовой точки Unicode, удовлетворяющей условию f(c), или -1, если таких кодовых точек нет.
Пример
Код:
f := func(c rune) bool {
return unicode.Is(unicode.Han, c)
}
fmt.Println(bytes.IndexFunc([]byte("Hello, 世界"), f))
fmt.Println(bytes.IndexFunc([]byte("Hello, world"), f))
Вывод:
7 -1
func IndexRune
func IndexRune(s []byte, r rune) int
IndexRune рассматривает s как последовательность кодовых точек в кодировке UTF-8. Она возвращает байтовый индекс первого вхождения заданной руны в s. Если rune отсутствует в s, возвращается -1. Если r — это utf8.RuneError, возвращается первое вхождение любой недопустимой последовательности байтов UTF-8.
Пример
Код:
fmt.Println(bytes.IndexRune([]byte("chicken"), 'k'))
fmt.Println(bytes.IndexRune([]byte("chicken"), 'd'))
Вывод:
4 -1
func Join
func Join(s [][]byte, sep []byte) []byte
Join объединяет элементы s в новый байтовый срез. В результирующем срезе между элементами помещается разделитель sep.
Пример
Код:
s := [][]byte{[]byte("foo"), []byte("bar"), []byte("baz")}
fmt.Printf("%s", bytes.Join(s, []byte(", ")))
Вывод:
foo, bar, baz
func LastIndex
func LastIndex(s, sep []byte) int
LastIndex возвращает индекс последнего вхождения sep в s или -1, если sep отсутствует в s.
Пример
Код:
fmt.Println(bytes.Index([]byte("go gopher"), []byte("go")))
fmt.Println(bytes.LastIndex([]byte("go gopher"), []byte("go")))
fmt.Println(bytes.LastIndex([]byte("go gopher"), []byte("rodent")))
Вывод:
0 3 -1
func LastIndexAny
func LastIndexAny(s []byte, chars string) int
LastIndexAny рассматривает s как последовательность кодовых точек Unicode в кодировке UTF-8. Она возвращает байтовый индекс последнего вхождения в s любой из кодовых точек Unicode, содержащихся в chars. Если chars пуст или нет общих кодовых точек, возвращается -1.
Пример
Код:
fmt.Println(bytes.LastIndexAny([]byte("go gopher"), "MüQp"))
fmt.Println(bytes.LastIndexAny([]byte("go 地鼠"), "地大"))
fmt.Println(bytes.LastIndexAny([]byte("go gopher"), "z,!."))
Вывод:
5 3 -1
func LastIndexByte 1.5
func LastIndexByte(s []byte, c byte) int
LastIndexByte возвращает индекс последнего вхождения c в s или -1, если c отсутствует в s.
Пример
Код:
fmt.Println(bytes.LastIndexByte([]byte("go gopher"), byte('g')))
fmt.Println(bytes.LastIndexByte([]byte("go gopher"), byte('r')))
fmt.Println(bytes.LastIndexByte([]byte("go gopher"), byte('z')))
Вывод:
3 8 -1
func LastIndexFunc
func LastIndexFunc(s []byte, f func(r rune) bool) int
LastIndexFunc рассматривает s как последовательность кодовых точек в кодировке UTF-8. Она возвращает байтовый индекс в s последней кодовой точки Unicode, удовлетворяющей условию f(c), или -1, если таких точек нет.
Пример
Код:
fmt.Println(bytes.LastIndexFunc([]byte("go gopher!"), unicode.IsLetter))
fmt.Println(bytes.LastIndexFunc([]byte("go gopher!"), unicode.IsPunct))
fmt.Println(bytes.LastIndexFunc([]byte("go gopher!"), unicode.IsNumber))
Вывод:
8 9 -1
func Lines 1.24
func Lines(s []byte) iter.Seq[[]byte]
Lines возвращает итератор по строкам байтового среза s, заканчивающимся символом новой строки. Строки, выдаваемые итератором, включают завершающие символы новой строки. Если s пуст, итератор не выдаёт ни одной строки. Если s не заканчивается символом новой строки, последняя выданная строка не будет им заканчиваться. Возвращается одноразовый итератор.
Пример
Код:
text := []byte("Hello\nWorld\nGo Programming\n")
for line := range bytes.Lines(text) {
fmt.Printf("%q\n", line)
}
Вывод:
"Hello\n" "World\n" "Go Programming\n"
func Map
func Map(mapping func(r rune) rune, s []byte) []byte
Map возвращает копию байтового среза s, в которой все символы изменены согласно функции отображения. Если функция отображения возвращает отрицательное значение, символ удаляется из байтового среза без замены. Символы в s и результирующем срезе рассматриваются как кодовые точки в кодировке UTF-8.
Пример
Код:
rot13 := func(r rune) rune {
switch {
case r >= 'A' && r <= 'Z':
return 'A' + (r-'A'+13)%26
case r >= 'a' && r <= 'z':
return 'a' + (r-'a'+13)%26
}
return r
}
fmt.Printf("%s\n", bytes.Map(rot13, []byte("'Twas brillig and the slithy gopher...")))
Вывод:
'Gjnf oevyyvt naq gur fyvgul tbcure...
func Repeat
func Repeat(b []byte, count int) []byte
Repeat возвращает новый байтовый срез, состоящий из count копий b.
Функция вызывает панику, если count отрицателен или если результат вычисления (len(b) * count) переполняется.
Пример
Код:
fmt.Printf("ba%s", bytes.Repeat([]byte("na"), 2))
Вывод:
banana
func Replace
func Replace(s, old, new []byte, n int) []byte
Replace возвращает копию среза s, в которой первые n неперекрывающихся вхождений old заменены на new. Если old пуст, совпадение находится в начале среза и после каждой последовательности UTF-8, что даёт до k+1 замен для среза из k рун. Если n < 0, количество замен не ограничено.
Пример
Код:
fmt.Printf("%s\n", bytes.Replace([]byte("oink oink oink"), []byte("k"), []byte("ky"), 2))
fmt.Printf("%s\n", bytes.Replace([]byte("oink oink oink"), []byte("oink"), []byte("moo"), -1))
Вывод:
oinky oinky oink moo moo moo
func ReplaceAll 1.12
func ReplaceAll(s, old, new []byte) []byte
ReplaceAll возвращает копию среза s, в которой все неперекрывающиеся вхождения old заменены на new. Если old пуст, совпадение находится в начале среза и после каждой последовательности UTF-8, что даёт до k+1 замен для среза из k рун.
Пример
Код:
fmt.Printf("%s\n", bytes.ReplaceAll([]byte("oink oink oink"), []byte("oink"), []byte("moo")))
Вывод:
moo moo moo
func Runes
func Runes(s []byte) []rune
Runes рассматривает s как последовательность кодовых точек в кодировке UTF-8. Она возвращает срез рун (кодовых точек Unicode), эквивалентный s.
Пример
Код:
rs := bytes.Runes([]byte("go gopher"))
for _, r := range rs {
fmt.Printf("%#U\n", r)
}
Вывод:
U+0067 'g' U+006F 'o' U+0020 ' ' U+0067 'g' U+006F 'o' U+0070 'p' U+0068 'h' U+0065 'e' U+0072 'r'
func Split
func Split(s, sep []byte) [][]byte
Split разделяет s на все подсрезы, отделённые sep, и возвращает срез подсрезов, расположенных между этими разделителями. Если sep пуст, Split разделяет после каждой последовательности UTF-8. Функция эквивалентна SplitN со значением count -1.
Чтобы разделить строку по первому вхождению разделителя, см. Cut.
Пример
Код:
fmt.Printf("%q\n", bytes.Split([]byte("a,b,c"), []byte(",")))
fmt.Printf("%q\n", bytes.Split([]byte("a man a plan a canal panama"), []byte("a ")))
fmt.Printf("%q\n", bytes.Split([]byte(" xyz "), []byte("")))
fmt.Printf("%q\n", bytes.Split([]byte(""), []byte("Bernardo O'Higgins")))
Вывод:
["a" "b" "c"] ["" "man " "plan " "canal panama"] [" " "x" "y" "z" " "] [""]
func SplitAfter
func SplitAfter(s, sep []byte) [][]byte
SplitAfter разделяет s на все подсрезы после каждого вхождения sep и возвращает срез этих подсрезов. Если sep пуст, SplitAfter разделяет после каждой последовательности UTF-8. Функция эквивалентна SplitAfterN со значением count -1.
Пример
Код:
fmt.Printf("%q\n", bytes.SplitAfter([]byte("a,b,c"), []byte(",")))
Вывод:
["a," "b," "c"]
func SplitAfterN
func SplitAfterN(s, sep []byte, n int) [][]byte
SplitAfterN разделяет s на подсрезы после каждого вхождения sep и возвращает срез этих подсрезов. Если sep пуст, SplitAfterN разделяет после каждой последовательности UTF-8. Значение count определяет количество возвращаемых подсрезов:
- n > 0: не более n подсрезов; последний подсрез будет оставшейся неразделённой частью;
- n == 0: результат — nil (ноль подсрезов);
- n < 0: все подсрезы.
Пример
Код:
fmt.Printf("%q\n", bytes.SplitAfterN([]byte("a,b,c"), []byte(","), 2))
Вывод:
["a," "b,c"]
func SplitAfterSeq 1.24
func SplitAfterSeq(s, sep []byte) iter.Seq[[]byte]
SplitAfterSeq возвращает итератор по подсрезам s, разделённым после каждого вхождения sep. Итератор выдаёт те же подсрезы, что и SplitAfter(s, sep), но без создания нового среза, содержащего эти подсрезы. Возвращается одноразовый итератор.
Пример
Код:
s := []byte("a,b,c,d")
for part := range bytes.SplitAfterSeq(s, []byte(",")) {
fmt.Printf("%q\n", part)
}
Вывод:
"a," "b," "c," "d"
func SplitN
func SplitN(s, sep []byte, n int) [][]byte
SplitN разделяет s на подсрезы, отделённые sep, и возвращает срез подсрезов, расположенных между этими разделителями. Если sep пуст, SplitN разделяет после каждой последовательности UTF-8. Значение count определяет количество возвращаемых подсрезов:
- n > 0: не более n подсрезов; последний подсрез будет несегментированным остатком;
- n == 0: результат — nil (ноль подсрезов);
- n < 0: все подсрезы.
Чтобы разделить строку вокруг первого вхождения разделителя, см. Cut.
Пример
Код:
fmt.Printf("%q\n", bytes.SplitN([]byte("a,b,c"), []byte(","), 2))
z := bytes.SplitN([]byte("a,b,c"), []byte(","), 0)
fmt.Printf("%q (nil = %v)\n", z, z == nil)
Вывод:
["a" "b,c"] [] (nil = true)
func SplitSeq 1.24
func SplitSeq(s, sep []byte) iter.Seq[[]byte]
SplitSeq возвращает итератор по всем подсрезам s, разделённым sep. Итератор выдаёт те же подсрезы, что и Split(s, sep), но не создаёт новый срез, содержащий подсрезы. Возвращается одноразовый итератор.
Пример
Код:
s := []byte("a,b,c,d")
for part := range bytes.SplitSeq(s, []byte(",")) {
fmt.Printf("%q\n", part)
}
Вывод:
"a" "b" "c" "d"
func Title
func Title(s []byte) []byte
Title рассматривает s как байты в кодировке UTF-8 и возвращает копию, в которой все буквы Unicode, начинающие слова, преобразованы в заглавный регистр.
Устарело: правило, используемое Title для определения границ слов, некорректно обрабатывает знаки пунктуации Unicode. Вместо него используйте golang.org/x/text/cases.
Пример
Код:
fmt.Printf("%s", bytes.Title([]byte("her royal highness")))
Вывод:
Her Royal Highness
func ToLower
func ToLower(s []byte) []byte
ToLower возвращает копию среза байтов s, в которой все буквы Unicode преобразованы в нижний регистр.
Пример
Код:
fmt.Printf("%s", bytes.ToLower([]byte("Gopher")))
Вывод:
gopher
func ToLowerSpecial
func ToLowerSpecial(c unicode.SpecialCase, s []byte) []byte
ToLowerSpecial рассматривает s как байты в кодировке UTF-8 и возвращает копию, в которой все буквы Unicode преобразованы в нижний регистр с приоритетом особых правил изменения регистра.
Пример
Код:
str := []byte("AHOJ VÝVOJÁRİ GOLANG")
totitle := bytes.ToLowerSpecial(unicode.AzeriCase, str)
fmt.Println("Original : " + string(str))
fmt.Println("ToLower : " + string(totitle))
Вывод:
Original : AHOJ VÝVOJÁRİ GOLANG ToLower : ahoj vývojári golang
func ToTitle
func ToTitle(s []byte) []byte
ToTitle рассматривает s как байты в кодировке UTF-8 и возвращает копию, в которой все буквы Unicode преобразованы в заглавный регистр.
Пример
Код:
fmt.Printf("%s\n", bytes.ToTitle([]byte("loud noises")))
fmt.Printf("%s\n", bytes.ToTitle([]byte("брат")))
Вывод:
LOUD NOISES БРАТ
func ToTitleSpecial
func ToTitleSpecial(c unicode.SpecialCase, s []byte) []byte
ToTitleSpecial рассматривает s как байты в кодировке UTF-8 и возвращает копию, в которой все буквы Unicode преобразованы в заглавный регистр с приоритетом особых правил изменения регистра.
Пример
Код:
str := []byte("ahoj vývojári golang")
totitle := bytes.ToTitleSpecial(unicode.AzeriCase, str)
fmt.Println("Original : " + string(str))
fmt.Println("ToTitle : " + string(totitle))
Вывод:
Original : ahoj vývojári golang ToTitle : AHOJ VÝVOJÁRİ GOLANG
func ToUpper
func ToUpper(s []byte) []byte
ToUpper возвращает копию среза байтов s, в которой все буквы Unicode преобразованы в верхний регистр.
Пример
Код:
fmt.Printf("%s", bytes.ToUpper([]byte("Gopher")))
Вывод:
GOPHER
func ToUpperSpecial
func ToUpperSpecial(c unicode.SpecialCase, s []byte) []byte
ToUpperSpecial рассматривает s как байты в кодировке UTF-8 и возвращает копию, в которой все буквы Unicode преобразованы в верхний регистр с приоритетом особых правил изменения регистра.
Пример
Код:
str := []byte("ahoj vývojári golang")
totitle := bytes.ToUpperSpecial(unicode.AzeriCase, str)
fmt.Println("Original : " + string(str))
fmt.Println("ToUpper : " + string(totitle))
Вывод:
Original : ahoj vývojári golang ToUpper : AHOJ VÝVOJÁRİ GOLANG
func ToValidUTF8 1.13
func ToValidUTF8(s, replacement []byte) []byte
ToValidUTF8 рассматривает s как байты в кодировке UTF-8 и возвращает копию, в которой каждая последовательность байтов, представляющая некорректный UTF-8, заменена байтами replacement, который может быть пустым.
Пример
Код:
fmt.Printf("%s\n", bytes.ToValidUTF8([]byte("abc"), []byte("\uFFFD")))
fmt.Printf("%s\n", bytes.ToValidUTF8([]byte("a\xffb\xC0\xAFc\xff"), []byte("")))
fmt.Printf("%s\n", bytes.ToValidUTF8([]byte("\xed\xa0\x80"), []byte("abc")))
Вывод:
abc abc abc
func Trim
func Trim(s []byte, cutset string) []byte
Trim возвращает подсрез s, удаляя все начальные и конечные кодовые точки UTF-8, содержащиеся в cutset.
Пример
Код:
fmt.Printf("[%q]", bytes.Trim([]byte(" !!! Achtung! Achtung! !!! "), "! "))
Вывод:
["Achtung! Achtung"]
func TrimFunc
func TrimFunc(s []byte, f func(r rune) bool) []byte
TrimFunc возвращает подсрез s, удаляя все начальные и конечные кодовые точки UTF-8 c, для которых выполняется f(c).
Пример
Код:
fmt.Println(string(bytes.TrimFunc([]byte("go-gopher!"), unicode.IsLetter)))
fmt.Println(string(bytes.TrimFunc([]byte("\"go-gopher!\""), unicode.IsLetter)))
fmt.Println(string(bytes.TrimFunc([]byte("go-gopher!"), unicode.IsPunct)))
fmt.Println(string(bytes.TrimFunc([]byte("1234go-gopher!567"), unicode.IsNumber)))
Вывод:
-gopher! "go-gopher!" go-gopher go-gopher!
func TrimLeft
func TrimLeft(s []byte, cutset string) []byte
TrimLeft возвращает подсрез s, удаляя все начальные кодовые точки UTF-8, содержащиеся в cutset.
Пример
Код:
fmt.Print(string(bytes.TrimLeft([]byte("453gopher8257"), "0123456789")))
Вывод:
gopher8257
func TrimLeftFunc
func TrimLeftFunc(s []byte, f func(r rune) bool) []byte
TrimLeftFunc рассматривает s как байты в кодировке UTF-8 и возвращает подсрез s, удаляя все начальные кодовые точки UTF-8 c, для которых выполняется f(c).
Пример
Код:
fmt.Println(string(bytes.TrimLeftFunc([]byte("go-gopher"), unicode.IsLetter)))
fmt.Println(string(bytes.TrimLeftFunc([]byte("go-gopher!"), unicode.IsPunct)))
fmt.Println(string(bytes.TrimLeftFunc([]byte("1234go-gopher!567"), unicode.IsNumber)))
Вывод:
-gopher go-gopher! go-gopher!567
func TrimPrefix 1.1
func TrimPrefix(s, prefix []byte) []byte
TrimPrefix возвращает s без указанного префикса в начале строки. Если s не начинается с prefix, возвращается s без изменений.
Пример
Код:
var b = []byte("Goodbye,, world!")
b = bytes.TrimPrefix(b, []byte("Goodbye,"))
b = bytes.TrimPrefix(b, []byte("See ya,"))
fmt.Printf("Hello%s", b)
Вывод:
Hello, world!
func TrimRight
func TrimRight(s []byte, cutset string) []byte
TrimRight возвращает подсрез s, удаляя все конечные кодовые точки UTF-8, содержащиеся в cutset.
Пример
Код:
fmt.Print(string(bytes.TrimRight([]byte("453gopher8257"), "0123456789")))
Вывод:
453gopher
func TrimRightFunc
func TrimRightFunc(s []byte, f func(r rune) bool) []byte
TrimRightFunc возвращает подсрез s, удаляя все конечные кодовые точки UTF-8 c, для которых выполняется f(c).
Пример
Код:
fmt.Println(string(bytes.TrimRightFunc([]byte("go-gopher"), unicode.IsLetter)))
fmt.Println(string(bytes.TrimRightFunc([]byte("go-gopher!"), unicode.IsPunct)))
fmt.Println(string(bytes.TrimRightFunc([]byte("1234go-gopher!567"), unicode.IsNumber)))
Вывод:
go- go-gopher 1234go-gopher!
func TrimSpace
func TrimSpace(s []byte) []byte
TrimSpace возвращает подсрез s, удаляя все начальные и конечные пробельные символы согласно определению Unicode.
Пример
Код:
fmt.Printf("%s", bytes.TrimSpace([]byte(" \t\n a lone gopher \n\t\r\n")))
Вывод:
a lone gopher
func TrimSuffix 1.1
func TrimSuffix(s, suffix []byte) []byte
TrimSuffix возвращает s без указанного суффикса в конце строки. Если s не заканчивается на suffix, возвращается s без изменений.
Пример
Код:
var b = []byte("Hello, goodbye, etc!")
b = bytes.TrimSuffix(b, []byte("goodbye, etc!"))
b = bytes.TrimSuffix(b, []byte("gopher"))
b = append(b, bytes.TrimSuffix([]byte("world!"), []byte("x!"))...)
os.Stdout.Write(b)
Вывод:
Hello, world!
type Buffer
Buffer — это буфер байтов переменного размера с методами Buffer.Read и Buffer.Write. Нулевое значение Buffer — пустой буфер, готовый к использованию.
type Buffer struct {
// contains filtered or unexported fields
}
Пример
Код:
var b bytes.Buffer // A Buffer needs no initialization.
b.Write([]byte("Hello "))
fmt.Fprintf(&b, "world!")
b.WriteTo(os.Stdout)
Вывод:
Hello world!
Пример (читатель)
Код:
// A Buffer can turn a string or a []byte into an io.Reader.
buf := bytes.NewBufferString("R29waGVycyBydWxlIQ==")
dec := base64.NewDecoder(base64.StdEncoding, buf)
io.Copy(os.Stdout, dec)
Вывод:
Gophers rule!
func NewBuffer
func NewBuffer(buf []byte) *Buffer
NewBuffer создает и инициализирует новый Buffer, используя buf в качестве исходного содержимого. Новый Buffer получает владение buf, и вызывающий код не должен использовать buf после этого вызова. NewBuffer предназначен для подготовки Buffer к чтению существующих данных. Его также можно использовать, чтобы задать начальный размер внутреннего буфера для записи. Для этого buf должен иметь желаемую емкость, но нулевую длину.
В большинстве случаев для инициализации Buffer достаточно new(Buffer) (или просто объявления переменной типа Buffer).
func NewBufferString
func NewBufferString(s string) *Buffer
NewBufferString создает и инициализирует новый Buffer, используя строку s в качестве исходного содержимого. Он предназначен для подготовки буфера к чтению существующей строки.
В большинстве случаев для инициализации Buffer достаточно new(Buffer) (или просто объявления переменной типа Buffer).
func (*Buffer) Available 1.21
func (b *Buffer) Available() int
Available возвращает количество неиспользуемых байтов в буфере.
func (*Buffer) AvailableBuffer 1.21
func (b *Buffer) AvailableBuffer() []byte
AvailableBuffer возвращает пустой буфер емкостью b.Available(). Предполагается, что в этот буфер будут добавлены данные, после чего он будет передан в непосредственно следующий вызов Buffer.Write. Буфер действителен только до следующей операции записи в b.
Пример
Код:
var buf bytes.Buffer
for i := 0; i < 4; i++ {
b := buf.AvailableBuffer()
b = strconv.AppendInt(b, int64(i), 10)
b = append(b, ' ')
buf.Write(b)
}
os.Stdout.Write(buf.Bytes())
Вывод:
0 1 2 3
func (*Buffer) Bytes
func (b *Buffer) Bytes() []byte
Bytes возвращает срез длины b.Len(), содержащий непрочитанную часть буфера. Срез действителен только до следующего изменения буфера (то есть только до следующего вызова метода, такого как Buffer.Read, Buffer.Write, Buffer.Reset или Buffer.Truncate). Срез ссылается на содержимое буфера как минимум до следующего изменения буфера, поэтому немедленные изменения среза повлияют на результат последующих операций чтения.
Пример
Код:
buf := bytes.Buffer{}
buf.Write([]byte{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'})
os.Stdout.Write(buf.Bytes())
Вывод:
hello world
func (*Buffer) Cap 1.5
func (b *Buffer) Cap() int
Cap возвращает емкость базового среза байтов буфера, то есть общий объем памяти, выделенный для данных буфера.
Пример
Код:
buf1 := bytes.NewBuffer(make([]byte, 10)) buf2 := bytes.NewBuffer(make([]byte, 0, 10)) fmt.Println(buf1.Cap()) fmt.Println(buf2.Cap())
Вывод:
10 10
func (*Buffer) Grow 1.1
func (b *Buffer) Grow(n int)
Grow увеличивает емкость буфера, если необходимо, чтобы гарантировать место еще для n байтов. После вызова Grow(n) в буфер можно записать как минимум n байтов без повторного выделения памяти. Если n отрицательно, Grow вызовет панику. Если емкость буфера нельзя увеличить, будет вызвана паника с ErrTooLarge.
Пример
Код:
var b bytes.Buffer
b.Grow(64)
bb := b.Bytes()
b.Write([]byte("64 bytes or fewer"))
fmt.Printf("%q", bb[:b.Len()])
Вывод:
"64 bytes or fewer"
func (*Buffer) Len
func (b *Buffer) Len() int
Len возвращает количество байтов в непрочитанной части буфера; b.Len() == len(b.Bytes()).
Пример
Код:
var b bytes.Buffer
b.Grow(64)
b.Write([]byte("abcde"))
fmt.Printf("%d", b.Len())
Вывод:
5
func (*Buffer) Next
func (b *Buffer) Next(n int) []byte
Next возвращает срез, содержащий следующие n байтов из буфера, и сдвигает позицию в буфере так, как если бы эти байты были возвращены методом Buffer.Read. Если в буфере меньше n байтов, Next возвращает весь буфер. Срез действителен только до следующего вызова метода чтения или записи.
Пример
Код:
var b bytes.Buffer
b.Grow(64)
b.Write([]byte("abcde"))
fmt.Printf("%s\n", b.Next(2))
fmt.Printf("%s\n", b.Next(2))
fmt.Printf("%s", b.Next(2))
Вывод:
ab cd e
func (*Buffer) Peek 1.26
func (b *Buffer) Peek(n int) ([]byte, error)
Peek возвращает следующие n байтов, не сдвигая позицию в буфере. Если Peek возвращает меньше n байтов, он также возвращает io.EOF. Срез действителен только до следующего вызова метода чтения или записи. Срез ссылается на содержимое буфера как минимум до следующего изменения буфера, поэтому немедленные изменения среза повлияют на результат последующих операций чтения.
func (*Buffer) Read
func (b *Buffer) Read(p []byte) (n int, err error)
Read считывает из буфера следующие len(p) байтов или до тех пор, пока буфер не опустеет. Возвращаемое значение n — количество считанных байтов. Если в буфере нет данных для возврата, err равен io.EOF (если только len(p) не равен нулю); в противном случае он равен nil.
Пример
Код:
var b bytes.Buffer
b.Grow(64)
b.Write([]byte("abcde"))
rdbuf := make([]byte, 1)
n, err := b.Read(rdbuf)
if err != nil {
panic(err)
}
fmt.Println(n)
fmt.Println(b.String())
fmt.Println(string(rdbuf))
Вывод:
1 bcde a
func (*Buffer) ReadByte
func (b *Buffer) ReadByte() (byte, error)
ReadByte считывает и возвращает следующий байт из буфера. Если байтов нет, возвращается ошибка io.EOF.
Пример
Код:
var b bytes.Buffer
b.Grow(64)
b.Write([]byte("abcde"))
c, err := b.ReadByte()
if err != nil {
panic(err)
}
fmt.Println(c)
fmt.Println(b.String())
Вывод:
97 bcde
func (*Buffer) ReadBytes
func (b *Buffer) ReadBytes(delim byte) (line []byte, err error)
ReadBytes считывает данные до первого вхождения delim во входных данных и возвращает срез, содержащий данные вплоть до разделителя включительно. Если ReadBytes встречает ошибку до обнаружения разделителя, он возвращает данные, считанные до ошибки, и саму ошибку (часто io.EOF). ReadBytes возвращает err != nil тогда и только тогда, когда возвращенные данные не заканчиваются на delim.
func (*Buffer) ReadFrom
func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error)
ReadFrom считывает данные из r до EOF и добавляет их в буфер, увеличивая его размер по мере необходимости. Возвращаемое значение n — количество считанных байтов. Также возвращается любая ошибка, кроме io.EOF, возникшая при чтении. Если буфер становится слишком большим, ReadFrom вызовет панику с ErrTooLarge.
func (*Buffer) ReadRune
func (b *Buffer) ReadRune() (r rune, size int, err error)
ReadRune считывает и возвращает следующую кодовую точку Unicode в кодировке UTF-8 из буфера. Если байтов нет, возвращается ошибка io.EOF. Если байты содержат некорректную последовательность UTF-8, метод потребляет один байт и возвращает U+FFFD, 1.
func (*Buffer) ReadString
func (b *Buffer) ReadString(delim byte) (line string, err error)
ReadString считывает данные до первого вхождения delim во входных данных и возвращает строку, содержащую данные вплоть до разделителя включительно. Если ReadString встречает ошибку до обнаружения разделителя, он возвращает данные, считанные до ошибки, и саму ошибку (часто io.EOF). ReadString возвращает err != nil тогда и только тогда, когда возвращенные данные не заканчиваются на delim.
func (*Buffer) Reset
func (b *Buffer) Reset()
Reset очищает буфер, но сохраняет базовое хранилище для последующих операций записи. Reset эквивалентен вызову Buffer.Truncate(0).
func (*Buffer) String
func (b *Buffer) String() string
String возвращает содержимое непрочитанной части буфера в виде строки. Если Buffer — nil-указатель, возвращается "<nil>".
Для более эффективного создания строк см. тип strings.Builder.
func (*Buffer) Truncate
func (b *Buffer) Truncate(n int)
Truncate отбрасывает все байты буфера, кроме первых n непрочитанных, но продолжает использовать то же выделенное хранилище. Вызывает панику, если n отрицательно или превышает длину буфера.
func (*Buffer) UnreadByte
func (b *Buffer) UnreadByte() error
UnreadByte возвращает последний байт, полученный при последней успешной операции чтения, которая прочитала хотя бы один байт. Если после последнего чтения была выполнена запись, последнее чтение завершилось ошибкой или прочитало ноль байтов, UnreadByte возвращает ошибку.
func (*Buffer) UnreadRune
func (b *Buffer) UnreadRune() error
UnreadRune возвращает последнюю руну, полученную вызовом Buffer.ReadRune. Если последняя операция чтения или записи буфера не была успешным вызовом Buffer.ReadRune, UnreadRune возвращает ошибку. (В этом отношении метод строже, чем Buffer.UnreadByte, который возвращает последний байт, полученный при любой операции чтения.)
func (*Buffer) Write
func (b *Buffer) Write(p []byte) (n int, err error)
Write добавляет содержимое p в буфер, при необходимости увеличивая его размер. Возвращаемое значение n — длина p; err всегда равно nil. Если буфер становится слишком большим, Write вызывает панику с ErrTooLarge.
func (*Buffer) WriteByte
func (b *Buffer) WriteByte(c byte) error
WriteByte добавляет байт c в буфер, при необходимости увеличивая его размер. Возвращаемая ошибка всегда равна nil, но включена для соответствия методу WriteByte типа bufio.Writer. Если буфер становится слишком большим, WriteByte вызывает панику с ErrTooLarge.
func (*Buffer) WriteRune
func (b *Buffer) WriteRune(r rune) (n int, err error)
WriteRune добавляет в буфер UTF-8-кодировку кодовой точки Unicode r и возвращает количество записанных байтов и nil в качестве ошибки. Ошибка nil включена для соответствия методу WriteRune типа bufio.Writer. Размер буфера увеличивается при необходимости; если он становится слишком большим, WriteRune вызывает панику с ErrTooLarge.
func (*Buffer) WriteString
func (b *Buffer) WriteString(s string) (n int, err error)
WriteString добавляет содержимое s в буфер, при необходимости увеличивая его размер. Возвращаемое значение n — длина s; err всегда равно nil. Если буфер становится слишком большим, WriteString вызывает панику с ErrTooLarge.
func (*Buffer) WriteTo
func (b *Buffer) WriteTo(w io.Writer) (n int64, err error)
WriteTo записывает данные в w, пока буфер не опустеет или не возникнет ошибка. Возвращаемое значение n — количество записанных байтов; оно всегда помещается в int, но имеет тип int64 для соответствия интерфейсу io.WriterTo. Также возвращается любая ошибка, возникшая при записи.
type Reader
Reader реализует интерфейсы io.Reader, io.ReaderAt, io.WriterTo, io.Seeker, io.ByteScanner и io.RuneScanner, читая данные из среза байтов. В отличие от Buffer, Reader доступен только для чтения и поддерживает перемещение по данным. Нулевое значение Reader работает как Reader пустого среза.
type Reader struct {
// contains filtered or unexported fields
}
func NewReader
func NewReader(b []byte) *Reader
NewReader возвращает новый Reader, читающий данные из b.
func (*Reader) Len
func (r *Reader) Len() int
Len возвращает количество байтов в непрочитанной части среза.
Пример
Код:
fmt.Println(bytes.NewReader([]byte("Hi!")).Len())
fmt.Println(bytes.NewReader([]byte("こんにちは!")).Len())
Результат:
3 16
func (*Reader) Read
func (r *Reader) Read(b []byte) (n int, err error)
Read реализует интерфейс io.Reader.
func (*Reader) ReadAt
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
ReadAt реализует интерфейс io.ReaderAt.
func (*Reader) ReadByte
func (r *Reader) ReadByte() (byte, error)
ReadByte реализует интерфейс io.ByteReader.
func (*Reader) ReadRune
func (r *Reader) ReadRune() (ch rune, size int, err error)
ReadRune реализует интерфейс io.RuneReader.
func (*Reader) Reset 1.7
func (r *Reader) Reset(b []byte)
Reset перенастраивает Reader для чтения данных из b.
func (*Reader) Seek
func (r *Reader) Seek(offset int64, whence int) (int64, error)
Seek реализует интерфейс io.Seeker.
func (*Reader) Size 1.5
func (r *Reader) Size() int64
Size возвращает исходную длину базового среза байтов. Size — это количество байтов, доступных для чтения с помощью Reader.ReadAt. Результат не зависит от вызовов каких-либо методов, кроме Reader.Reset.
func (*Reader) UnreadByte
func (r *Reader) UnreadByte() error
UnreadByte дополняет Reader.ReadByte при реализации интерфейса io.ByteScanner.
func (*Reader) UnreadRune
func (r *Reader) UnreadRune() error
UnreadRune дополняет Reader.ReadRune при реализации интерфейса io.RuneScanner.
func (*Reader) WriteTo 1.1
func (r *Reader) WriteTo(w io.Writer) (n int64, err error)
WriteTo реализует интерфейс io.WriterTo.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/bytes/