Golang bytes 包学习

简介: Golang bytes 包学习

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

常量

MinRead 是传递给 Buffer.ReadFrom 方法的最小切片大小。只要 Buffer 里面的内容长度没有超出 MinRead 个字节,ReadFrom 不会增长 Buffer 里面的缓冲区大小。

const MinRead = 512

变量

当内存装不下需要放入 buffer 的数据的时候,会抛出一个 panic,内容就是 ErrTooLarge

var ErrTooLarge = errors.New("bytes.Buffer: too large")

函数

Compare

func Compare(a, b []byte) int

按字典顺序比较两个字节切片。如果 a == b,返回 0,如果 a < b 返回 -1,如果 a > b 返回 1。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleCompare() {
  // 通过将结果与零进行比较来解释比较结果
  var a, b []byte
  a = []byte("a")
  b = []byte("b")
  if bytes.Compare(a, b) < 0 {
    // a 小于 b
    fmt.Printf("a = '%s', b = '%s', a < b\n", a, b)
  }
  a = []byte("a")
  b = []byte("a")
  if bytes.Compare(a, b) <= 0 {
    // a 小于或等于 b
    fmt.Printf("a = '%s', b = '%s', a <= b\n", a, b)
  }
  a = []byte("b")
  b = []byte("a")
  if bytes.Compare(a, b) > 0 {
    // a 大于 b
    fmt.Printf("a = '%s', b = '%s', a > b\n", a, b)
  }
  a = []byte("b")
  b = []byte("b")
  if bytes.Compare(a, b) >= 0 {
    // a 大于或等于 b
    fmt.Printf("a = '%s', b = '%s', a >= b\n", a, b)
  }
  // 判断两个字节切片是否相等
  if bytes.Equal(a, b) {
    // a 等于 b
    fmt.Printf("a = '%s', b = '%s', a == b\n", a, b)
  }
  b = []byte("c")
  if !bytes.Equal(a, b) {
    // a 不等于 b
    fmt.Printf("a = '%s', b = '%s', a != b\n", a, b)
  }
  // Output:
  // a = 'a', b = 'b', a < b
  // a = 'a', b = 'a', a <= b
  // a = 'b', b = 'a', a > b
  // a = 'b', b = 'b', a >= b
  // a = 'b', b = 'b', a == b
  // a = 'b', b = 'c', a != b
}
func ExampleSearch() {
  var needle []byte
  var haystack [][]byte // 假设是有序的
  // 模拟测试数据
  needle = []byte("ccb")
  haystack = [][]byte{
    []byte("cca"),
    []byte("ccb"),
    []byte("ccc"),
  }
    // haystack 需要是有序的
  i := sort.Search(len(haystack), func(i int) bool {
    // Return haystack[i] >= needle.
    return bytes.Compare(haystack[i], needle) >= 0
  })
  if i < len(haystack) && bytes.Equal(haystack[i], needle) {
    fmt.Println("Found it!")
  }
  // Output:
  // Found it!
}
```

Contains

func Contains(b, subslice []byte) bool

检查 b 里面是否包含了 subslice 字节序列。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleContains() {
  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("")))
  // Output:
  // true
  // false
  // true
  // true
}
```

ContainsAny

func ContainsAny(b []byte, chars string) bool

ContainsAny 检查字符串 chars utf-8编码的字符切片里面是否有任何字节在 b 里面。

chars 是空字符串的时候都返回 false

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleContainsAny() {
  fmt.Println(bytes.ContainsAny([]byte("I like seafood."), "fAo!"))
  fmt.Println(bytes.ContainsAny([]byte("I like seafood."), "去是伟大的."))
  fmt.Println(bytes.ContainsAny([]byte("I like seafood."), ""))
  fmt.Println(bytes.ContainsAny([]byte(""), ""))
  // Output:
  // true
  // true
  // false
  // false
}
```

ContainsRune

func ContainsRune(b []byte, r rune) bool

rune 可以简单看作是字符类型(可以是多字节字符)。

ContainsRune 检查 r 是否出现在 utf-8 编码的字节序列中。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleContainsRune() {
  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(""), '@'))
  // Output:
  // true
  // false
  // true
  // true
  // false
}
```

Count

func Count(s, sep []byte) int

Count 用来计算 sep 出现在 s 中的次数,其中 s 是 utf-8 编码的字节序列。

如果 sep 为空,则返回 s 的长度 + 1

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleCount() {
  fmt.Println(bytes.Count([]byte("cheese"), []byte("e")))
  // before & after each rune
  fmt.Println(bytes.Count([]byte("five"), []byte("")))
  // Output:
  // 3
  // 5
}
```

Equal

func Equal(a, b []byte) bool

Equal 判断字节切片 ab 的是否相等。如果传 nil,则视作空切片。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleEqual() {
  fmt.Println(bytes.Equal([]byte("Go"), []byte("Go")))
  fmt.Println(bytes.Equal([]byte("Go"), []byte("C++")))
  // Output:
  // true
  // false
}
```

EqualFold

func EqualFold(s, t []byte) bool

EqualFold 比较 UTF-8 编码是否相等,不区分大小写。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleEqualFold() {
  fmt.Println(bytes.EqualFold([]byte("Go"), []byte("go")))
  // Output:
  // true
}
```

Fields

func Fields(s []byte) [][]byte

Fields 将参数当作一个 UTF-8 编码的字节切片,根据 unicode.IsSpace 定义的空白字符来拆分该字节切片,但是拆分的结果不会包含空白字符。如果只包含空白字符,则返回一个空的二维切片。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleFields() {
  fmt.Printf("Fields are: %q\n", bytes.Fields([]byte("  foo bar baz  ")))
  // Output:
  // Fields are: ["foo" "bar" "baz"]
}
```

FieldsFunc

func FieldsFunc(s []byte, f func(rune) bool) [][]byte

Fields 类似,只不过这里接收一个回调让用户可以返回一个布尔值,系统根据返回值决定是否使用这个字符来分割 Field。如果所有的字符都满足 f(r) 或者字节切片 s 的长度为 0,FieldsFunc 返回一个空的切片。FieldsFunc 不保证其调用 f(c) 的顺序。如果 f 对于给定的 c 没有返回一致的结果,则 FieldsFunc 可能会崩溃。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleFieldsFunc() {
  f := func(c rune) bool {
    return !unicode.IsLetter(c) && !unicode.IsNumber(c)
  }
  fmt.Printf("Fields are: %q\n", bytes.FieldsFunc([]byte("  foo1;bar2,baz3..."), f))
  // Output:
  // Fields are: ["foo1" "bar2" "baz3"]
}
```

HasPrefix

func HasPrefix(s, prefix []byte) bool

HasPrefix 检查字节切片是否以 prefix 切片开头。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleHasPrefix() {
  fmt.Println(bytes.HasPrefix([]byte("Gopher"), []byte("Go")))
  fmt.Println(bytes.HasPrefix([]byte("Gopher"), []byte("C")))
  fmt.Println(bytes.HasPrefix([]byte("Gopher"), []byte("")))
  // Output:
  // true
  // false
  // true
}
```

HasSuffix

func HasSuffix(s, suffix []byte) bool

HasPrefix 检查字节切片 s 是否以字节切片 prefix 结尾。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleHasSuffix() {
  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("")))
  // Output:
  // true
  // false
  // false
  // true
}
```

Index

func Index(s, sep []byte) int

Index 返回 seps 中的下标,如果 sep 不在 s 中则返回 -1。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleIndex() {
  fmt.Println(bytes.Index([]byte("chicken"), []byte("ken")))
  fmt.Println(bytes.Index([]byte("chicken"), []byte("dmr")))
  // Output:
  // 4
  // -1
}
```

IndexAny

func IndexAny(s []byte, chars string) int

检查 chars 任意字符是否在 s 中,如果在,则返回对应的下标,不存在或者 chars 为空则返回 -1。该函数将 s 视作 UTF-8 编码的字节切片。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleIndexAny() {
  fmt.Println(bytes.IndexAny([]byte("chicken"), "aeiouy"))
  fmt.Println(bytes.IndexAny([]byte("crwth"), "aeiouy"))
  // Output:
  // 2
  // -1
}
```

IndexByte

func IndexByte(b []byte, c byte) int

IndexByte 返回字节 c 在字节切片 b 中首次出现的下标,如果 c 不在 b 中返回 -1。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleIndexByte() {
  fmt.Println(bytes.IndexByte([]byte("chicken"), byte('k')))
  fmt.Println(bytes.IndexByte([]byte("chicken"), byte('g')))
  // Output:
  // 4
  // -1
}
```

IndexFunc

func IndexFunc(s []byte, f func(r rune) bool) int

Index 类似,不过接收一个自定义的回调函数来判断字符是否是满足条件的字符,是则返回 true,这个字符的索引就是 IndexFunc 的返回值。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleIndexFunc() {
  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))
  // Output:
  // 7
  // -1
}
```

IndexRune

func IndexRune(s []byte, r rune) int

IndexRunes 当作 UTF-8 字节切片,返回 rs 中第一次出现的索引,没有在 s 中则返回 -1。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleIndexRune() {
  fmt.Println(bytes.IndexRune([]byte("chicken"), 'k'))
  fmt.Println(bytes.IndexRune([]byte("chicken"), 'd'))
  // Output:
  // 4
  // -1
}
```

Join

func Join(s [][]byte, sep []byte) []byte

Join 使用 sep 作为分隔符来连接多个 []byte,返回连接后的结果。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleJoin() {
  s := [][]byte{
    []byte("foo"),
    []byte("bar"),
    []byte("baz"),
  }
  fmt.Printf("%s", bytes.Join(s, []byte(", ")))
  // Output:
  // foo, bar, baz
}
```

LastIndex

func LastIndex(s, sep []byte) int

LastIndex 返回 seps 中最后出现的索引,没有出现返回 -1。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleLastIndex() {
  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")))
  // Output:
  // 0
  // 3
  // -1
}
```

LastIndexAny

func LastIndexAny(s []byte, chars string) int

IndexAny 类似,但是这个是返回最终出现的位置。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleLastIndexAny() {
  fmt.Println(bytes.LastIndexAny([]byte("go gopher"), "MüQp"))
  fmt.Println(bytes.LastIndexAny([]byte("go 地鼠"), "地大"))
  fmt.Println(bytes.LastIndexAny([]byte("go gopher"), "z,!."))
  // Output:
  // 5
  // 3
  // -1
}
```

LastIndexByte

func LastIndexByte(s []byte, c byte) int

LastIndexByte 返回 cs 中最后出现的下标。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleLastIndexByte() {
  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')))
  // Output:
  // 3
  // 8
  // -1
}
```

LastIndexFunc

func LastIndexFunc(s []byte, f func(r rune) bool) int

LastIndexFuncIndexFunc 的效果类似,只不过这个是返回最后出现的下标。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleLastIndexFunc() {
  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))
  // Output:
  // 8
  // 9
  // -1
}
```

Map

func Map(mapping func(r rune) rune, s []byte) []byte

s 中的每一个字符 c 调用 mapping(c),返回新字符组成的字节切片,如果返回 -1,则返回的结果不包含这个字符。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleMap() {
  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", bytes.Map(rot13, []byte("'Twas brillig and the slithy gopher...")))
  // Output:
  // 'Gjnf oevyyvt naq gur fyvgul tbcure...
}
```

Repeat

func Repeat(b []byte, count int) []byte

Repeat 将一个字节切片 b 重复 count 次,返回最后的结果。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleRepeat() {
  fmt.Printf("ba%s", bytes.Repeat([]byte("na"), 2))
  // Output:
  // banana
}
```

Replace

func Replace(s, old, new []byte, n int) []byte

s 字节切片中的 old 切片替换为 new 切片,最多替换 n 次。如果 n 小于 0,则不限制替换次数。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleReplace() {
  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))
  // Output:
  // oinky oinky oink
  // moo moo moo
}
```

ReplaceAll

func ReplaceAll(s, old, new []byte) []byte

Replace 类似,不过这个是替换所有的 oldnew

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleReplaceAll() {
  fmt.Printf("%s\n", bytes.ReplaceAll([]byte("oink oink oink"), []byte("oink"), []byte("moo")))
  // Output:
  // moo moo moo
}
```

Runes

func Runes(s []byte) []rune

Runes 将字节切片转换为 []byte 类型,s 被视作是 UTF-8 编码的字节切片。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleRunes() {
  rs := bytes.Runes([]byte("go gopher"))
  for _, r := range rs {
    fmt.Printf("%#U\n", r)
  }
  // Output:
  // 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'
}
```

Split

func Split(s, sep []byte) [][]byte

Join 操作相反,根据 sep 来拆分 s

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleSplit() {
  fmt.Printf("%q\n", bytes.Split([]byte("a,b,c"), []byte(",")))
  fmt.Printf("%q\n", bytes.Split([]byte("a man a plan a cancel panama"), []byte("a ")))
  fmt.Printf("%q\n", bytes.Split([]byte(" xyz "), []byte("")))
  fmt.Printf("%q\n", bytes.Split([]byte(""), []byte("Bernardo O'Higgins")))
  // Output:
  // ["a" "b" "c"]
  // ["" "man " "plan " "cancel panama"]
  // [" " "x" "y" "z" " "]
  // [""]
}
```

SplitAfter

func SplitAfter(s, sep []byte) [][]byte

Split 类似,只不过最终结果的每一个字节切片里面包含了分隔符 sep。包含在前一个字节切片中。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleSplitAfter() {
  fmt.Printf("%q\n", bytes.SplitAfter([]byte("a,b,c"), []byte(",")))
  // Output:
  // ["a," "b," "c"]
}
```

SplitAfterN

func SplitAfterN(s, sep []byte, n int) [][]byte

SplitAfter 类似,但是最终返回的 [][]byte 的长度,最多为 n

  • n > 0: 最多返回 n 个子切片,最后一个是剩余的切片
  • n == 0: 返回 nil(0 个子切片)
  • n < 0: 返回所有子切片

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleSplitAfterN() {
  fmt.Printf("%q\n", bytes.SplitAfterN([]byte("a,b,c"), []byte(","), 2))
  // Output:
  // ["a," "b,c"]
}
```

SplitN

func SplitN(s, sep []byte, n int) [][]byte

SplitAfterN 类似,但是这个函数返回的子切片不包含分割符号(除了最后一个有可能包含)。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleSplitN() {
  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)
  // Output:
  // ["a" "b,c"]
  //[] (nil = true)
}
```

Title

func Title(s []byte) []byte

将字节切片转换为标题格式(每个单词改成大写)。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleTitle() {
  fmt.Printf("%s", bytes.Title([]byte("her royal highness")))
  // Output:
  // Her Royal Highness
}
```

ToLower

func ToLower(s []byte) []byte

返回一个新的字节切片,所有的 Unicode 字符被转换为小写格式。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleToLower() {
  fmt.Printf("%s", bytes.ToLower([]byte("Gopher")))
  // Output:
  // gopher
}
```

ToLowerSpecial

func ToLowerSpecial(c unicode.SpecialCase, s []byte) []byte

第一个参数是指定不同语言的大小写的,有可能某些语言的大小写和英语不太一样,其他和 ToLower 类似。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleToLowerSpecial() {
  str := []byte("AHOJ VÝVOJÁRİ GOLANG")
  totitle := bytes.ToLowerSpecial(unicode.AzeriCase, str)
  fmt.Println("Original : " + string(str))
  fmt.Println("ToLower : " + string(totitle))
  // Output:
  // Original : AHOJ VÝVOJÁRİ GOLANG
  // ToLower : ahoj vývojári golang
}
```

ToTitle

func ToTitle(s []byte) []byte

ToTitles 视为 UTF-8 编码的字节,并返回一个副本,其中所有 Unicode 字母都映射到其标题大小写。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleToTitle() {
  fmt.Printf("%s\n", bytes.ToTitle([]byte("loud noises")))
  fmt.Printf("%s\n", bytes.ToTitle([]byte("хлеб")))
  // Output:
  // LOUD NOISES
  // ХЛЕБ
}
```

ToTitleSpecial

func ToTitleSpecial(c unicode.SpecialCase, s []byte) []byte

ToTitleSpecials 视为 UTF-8 编码的字节,并返回一个副本,其中所有 Unicode 字母均映射到其标题大小写,并优先使用特殊的大小写规则。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleToTitleSpecial() {
  str := []byte("ahoj vývojári golang")
  totitle := bytes.ToTitleSpecial(unicode.AzeriCase, str)
  fmt.Println("Original : " + string(str))
  fmt.Println("ToTitle : " + string(totitle))
  // Output:
  // Original : ahoj vývojári golang
  // ToTitle : AHOJ VÝVOJÁRİ GOLANG
}
```

ToUpper

func ToUpper(s []byte) []byte

ToUpper 返回字节片 s 的副本,其中所有 Unicode 字母都映射到其大写字母。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleToUpper() {
  fmt.Printf("%s", bytes.ToUpper([]byte("Gopher")))
  // Output:
  // GOPHER
}
```

ToUpperSpecial

func ToUpperSpecial(c unicode.SpecialCase, s []byte) []byte

ToUpperSpecials 视为 UTF-8 编码的字节,并返回一个副本,其中所有 Unicode 字母均映射为它们的大写字母,优先考虑特殊的大小写规则。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleToUpperSpecial() {
  str := []byte("ahoj vývojári golang")
  totitle := bytes.ToUpperSpecial(unicode.AzeriCase, str)
  fmt.Println("Origin : " + string(str))
  fmt.Println("ToUpper : " + string(totitle))
  // Output:
  // Origin : ahoj vývojári golang
  // ToUpper : AHOJ VÝVOJÁRİ GOLANG
}
```

ToValidUTF8

func ToValidUTF8(s, replacement []byte) []byte

ToValidUTF8s 视为 UTF-8 编码的字节,并返回一个副本,将其中无效的 UTF-8 替换为 replacementreplacement 可以为空。

Trim

func Trim(s []byte, cutset string) []byte

Trim 去除 s 前后 cutset 字符串里的子字符,返回最后的结果。

点此查看实例

```
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleTrim() {
  fmt.Printf("[%q]", bytes.Trim([]byte(" !!! Achtung! Achtung! !!!"), "! "))
  // Output:
  // ["Achtung! Achtung"]
}
```

TrimFunc

func TrimFunc(s []byte, f func(r rune) bool) []byte

Trim 类似,只不过可以通过回调来筛选。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleTrimFunc() {
  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)))
  // Output:
  // -gopher!
  // "go-gopher!"
  // go-gopher
  // go-gopher!
}
```

TrimLeft

func TrimLeft(s []byte, cutset string) []byte

Trim 类似,但是只移除 s 左边的字符。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleTrimLeft() {
  fmt.Print(string(bytes.TrimLeft([]byte("453gopher8257"), "0123456789")))
  // Output:
  // gopher8257
}
```

TrimLeftFunc

func TrimLeftFunc(s []byte, f func(r rune) bool) []byte

TrimLeft 类似,但是可以通过回调筛选需要移除的字符。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleTrimLeftFunc() {
  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)))
  // Output:
  // -gopher
  // go-gopher!
  // go-gopher!567
}
```

TrimPrefix

func TrimPrefix(s, prefix []byte) []byte

Trim 类似,但是是移除 prefix 指定的前缀。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleTrimPrefix() {
  var b = []byte("Goodbye,, world!")
  b = bytes.TrimPrefix(b, []byte("Goodbye,"))
  b = bytes.TrimPrefix(b, []byte("See ya,"))
  fmt.Printf("Hello%s", b)
  // Output:
  // Hello, world!
}
```

TrimRight

func TrimRight(s []byte, cutset string) []byte

TrimLeft 类似,只不过是移除 s 末尾的字符。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleTrimRight() {
  fmt.Print(string(bytes.TrimRight([]byte("453gopher8257"), "0123456789")))
  // Output:
  // 453gopher
}
```

TrimRightFunc

func TrimRightFunc(s []byte, f func(r rune) bool) []byte

TrimRight 类似,只不过可以接收一个回调来筛选需要移除的字符。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "unicode"
)
func ExampleTrimRightFunc() {
  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)))
  // Output:
  // go-
  // go-gopher
  // 1234go-gopher!
}
```

TrimSpace

func TrimSpace(s []byte) []byte

移除字节切片 s 前后的空白字符。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleTrimSpace() {
  fmt.Printf("%s", bytes.TrimSpace([]byte(" \t\n a lone gopher \n\t\r\n")))
  // Output:
  // a lone gopher
}
```

TrimSuffix

func TrimSuffix(s, suffix []byte) []byte

移除字节切片 s 的后缀。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "os"
)
func ExampleTrimSuffix() {
  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)
  // Output:
  // Hello, world!
}
```

Buffer

一个 Buffer 是一个大小不固定的字节缓冲区。Buffer 的零值是一个空的缓冲区。

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
  "os"
)
func ExampleBuffer() {
  var b bytes.Buffer // 不需要初始化
  b.Write([]byte("Hello "))
  fmt.Fprintf(&b, "world!")
  b.WriteTo(os.Stdout)
  // Output:
  // Hello world!
}
```

点此查看实例(Reader)

```go
package golang_bytes_package_example
import (
  "bytes"
  "encoding/base64"
  "io"
  "os"
)
func ExampleBuffer1() {
  // 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)
  // Output:
  // Gophers rule!
}
```

NewBuffer

func NewBuffer(buf []byte) *Buffer

NewBuffer 使用 buf 作为其初始内容创建并初始化一个新的 Buffer。 新的 Buffer 拥有 buf 的所有权,并且在此调用之后,调用方不应使用buf。 NewBuffer 旨在准备一个 Buffer 以读取现有数据。 它也可以用来设置用于写入的内部缓冲区的初始大小。 为此,buf 应该具有所需的容量,但长度为零。

在大多数情况下,new(Buffer)(或仅声明一个 Buffer 变量)足以初始化 Buffer

NewBufferString

func NewBufferString(s string) *Buffer

NewBufferString 使用字符串 s 作为其初始内容创建并初始化一个新的 Buffer。目的是准备一个缓冲区以读取现有的字符串。

在大多数情况下,new(Buffer) (或仅声明一个 Buffer 变量) 足以初始化 Buffer

Buffer 方法

Bytes

func (b *Buffer) Bytes() []byte

字节返回长度为 b.Len() 的切片,其中包含缓冲区的未读部分。 该片仅在下一次修改缓冲区之前有效(即,仅在下一次调用诸如 ReadWriteResetTruncate 之类的方法之前)才有效。 切片至少在下一次缓冲区修改之前就将缓冲区内容作为别名,因此对切片的立即更改将影响将来读取的结果。

Cap

func (b *Buffer) Cap() int

Cap 返回缓冲区底层字节切片的容量,即为缓冲区数据分配的总空间。

Grow

func (b *Buffer) Grow(n int)

如有必要,可以增加缓冲区的容量,以保证另外 n 个字节的空间。在 Grow(n) 之后,至少可以将 n 个字节写入缓冲区,而无需进行其他分配。如果 n 为负数,Grow 会 panic。如果缓冲区无法增长,会引起一个 ErrTooLarge 的 panic。

Len

func (b *Buffer) Len() int

Len 返回缓冲区未读部分的字节数;b.Len() == len(b.Bytes())

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleBufferLen() {
  var b bytes.Buffer
  b.Grow(64)
  b.Write([]byte("abcde"))
  fmt.Printf("%d", b.Len())
  // Output:
  // 5
}
```

Next

func (b *Buffer) Next(n int) []byte

Next 返回一个包含缓冲区中接下来 n 个字节的切片,使缓冲区前进,就好像该字节已由 Read 返回。如果缓冲区中的字节数少于 n 个,则 Next 返回整个缓冲区。切片仅在下一次调用 readwrite 方法之前才有效。

Read

func (b *Buffer) Read(p []byte) (n int, err error)

Read 从缓冲区中读取下一个 len(p) 字节,或者直到缓冲区耗尽为止。返回值 n 是读取的字节数。如果缓冲区没有数据要返回,则 errio.EOF(除非 len(p) 为 0);否则为零。

ReadByte

func (b *Buffer) ReadByte() (byte, error)

ReadByte 读取并从缓冲区返回下一个字节。如果没有可用的字节,则返回错误 io.EOF

ReadBytes

func (b *Buffer) Readbytes(delim byte) (line []byte, err error)

ReadBytes 读取直到输入中第一次出现 delim 为止,并返回一个包含数据的切片,该数据直到并包括 delim。如果 ReadBytes 在找到定界符之前遇到错误,它将返回错误之前读取的数据和错误本身(通常为 io.EOF)。并且仅当返回的数据未以 delim 结尾时,ReadBytes 返回 err != nil

ReadFrom

func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error)

ReadFromr 读取数据,直到 EOF 并将其附加到缓冲区,然后根据需要增大缓冲区。返回值 n 是读取的字节数。读取期间遇到的除 io.EOF 以外的任何错误也将返回。如果缓冲区太大,ReadFrom 会引发 ErrTooLarge panic。

ReadRune

func (b *Buffer) ReadRune() (r rune, size int, err error)

ReadRune 从缓冲区读取并返回下一个 UTF-8 编码的 Unicode 字符。如果没有可用的字节,则返回的错误是 io.EOF。如果字节是错误的 UTF-8 编码,则它消耗一个字节并返回 U+FFFD,1。

ReadString

func (b *Buffer) ReadString(delim type) (line string, err error)

ReadString 读取直到输入中第一次出现 delim 为止,并返回一个字符串,其中包含直到定界符(包括定界符)的数据。如果 ReadString 在找到定界符之前遇到错误,它将返回错误之前读取的数据和错误本身(通常为 io.EOF)。当且仅当返回的数据未以 delim 结尾时,ReadString 才返回 err != nil

Reset

func (b *Buffer) Reset()

重置会将缓冲区重置为空,但会保留基础存储空间以供将来的写操作使用。重置与 Truncate(0) 相同。

String

func (b *Buffer) String()

String 以字符串形式返回缓冲区未读部分的内容。如果 Buffernil 指针,则返回 “”。

要更有效地构建字符串,请常见 strings.Builder 类型。

Truncate

func (b *Buffer) Truncate(n int)

Truncate 会丢弃缓冲区前 n 个未读取字节以外的所有字节,但会继续使用相同的已分配存储。如果 n 为负数或大于缓冲区的长度,则会发生 panic.

UnreadByte

func (b *Buffer) UnreadByte() error

UnreadByte 将最近一次成功读取操作的最后一个字节重新设置为未读取。如果自从上次成功读取后有写缓冲区操作,或者上次读取有错误,或者上次读取到 0 字节,UnreadByte 返回一个错误。

UnreadRune

func (b *Buffer) UnreadRune() error

UnreadByte 类似,只不过操作的是 rune

Write

func (b *Buffer) Write(p []byte) (n int, err error)

写操作会将 p 的内容附加到缓冲区,并根据需要扩展缓冲区。返回值 np 的长度;错误始终为零。如果缓冲区太大,则 Write 会引发 ErrTooLarge panic。

WriteByte

func (b *Buffer) WriteByte(c byte) error

写入一个字节到 Buffer。

WriteByte 将字节 c 附加到缓冲区,根据需要增大缓冲区。返回的错误始终为 nil,但包含该错误以匹配 bufio.WriterWriteByte。如果缓冲区太大,WriteByte 会引发 ErrTooLarge panic。

WriteRune

func (b *Buffer) WriteRune(r rune) (n int, err error)

ReadRune 类似,不过 WriteRune 是写入一个 rune 类型的数据。

WriteString

func (b *Buffer) WriteString(s string) (n int, err error)

写入一个字符串到 Buffer。

WriteStrings 的内容附加到缓冲区,根据需要增大缓冲区。返回值 ns 的长度;错误始终为 nil。如果缓冲区太大,引发 ErrTooLarge panic。

WriteTo

func (b *Buffer) WriteTo(w io.Writer) (n int64, err error)

WriteTo 将数据写入 w,直到缓冲区耗尽或发生错误。返回值 n 是写入的字节数。它始终适合 int,但与 io.WriterTo 接口匹配为 int64。写入期间遇到的任何错误也将返回。

Reader

Reader 通过读取字节切片来实现 io.Reader, io.ReaderAt, io.WriterTo, io.Seeker, io.ByteScannerio.RuneScanner 接口。与 Buffer 不同,Reader 是只读的,并支持查找。Reader 的零值的操作类似空切片的 Reader

NewReader

func NewReader(b []byte) *Reader

NewReaderb 返回一个新的 Reader,这个 Reader 将会从 b 读取数据。

Len

func (r *Reader) Len() int

Len 返回切片中未读部分的长度

点此查看实例

```go
package golang_bytes_package_example
import (
  "bytes"
  "fmt"
)
func ExampleReaderLen() {
  fmt.Println(bytes.NewReader([]byte("Hi!")).Len())
  fmt.Println(bytes.NewReader([]byte("こんにちは!")).Len())
  // Output:
  // 3
  // 16
}
```

Read

func (r *Reader) Read(b []byte) (n int, err error)

Read 实现了 io.Reader 接口。

ReadAt

func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)

ReadAt 实现了 io.ReaderAt 接口。

ReadByte

func (r *Reader) ReadByte() (byte, error)

ReadByte 实现了 io.ByteReader 接口

ReadRune

func (r *Reader) ReadRune() (ch rune, size int, err error)

ReadRune 实现了 io.RuneReader 接口

Reset

func (r *Reader) Reset(b []byte)

ResetReader 的内容重置为 b 字节切片。

Seek

func (r *Reader) Seek(offset int64, whence int) (int64, error)

Seek 实现了 io.Seeker 接口

Size

func (r *Reader) Size() int64

Size 返回了 Reader 底层切片的原始长度。Size 是可通过 ReadAt 读取的字节数。返回的值始终相同,并且不受任何其他方法调用的影响。

UnreadByte

func (r *Reader) UnreadByte() error

UnreadByte 在实现 io.ByteScanner 接口时对 ReadByte 进行了补充。

UnreadRune

func (r *Reader) UnreadRune() error

UnreadRune 在实现 io.RuneScanner 接口方面对 ReadRune 进行了补充。

WriteTo

func (r *Reader) WriteTo(w io.Writer) (n int64, err error)

WriteTo 实现了 io.WriterTo 接口。


目录
相关文章
|
2月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
173 87
Golang的math包常用方法
|
24天前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
17 0
|
2月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
41 3
|
2月前
|
Go
Golang语言基于GOPATH方式管理包(package)
这篇文章详细介绍了Golang语言中基于GOPATH方式管理包(package)的方法,包括包的概述、定义、引入格式、别名使用、匿名引入,以及如何快速入门自定义包,并通过具体代码案例展示了包的环境准备、代码编写、细节说明和程序运行。
37 3
|
2月前
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
32 3
|
3月前
|
Go 开发者
|
3月前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
41 0
|
4月前
|
编译器 Go C语言
通过例子学习在golang中调试程序
【7月更文挑战第4天】Go语言支持使用cgo进行汇编调试,官方文档在golang.org/doc/asm。注意,调试Go运行时可能遇到变量不可用或行号错误,需谨慎使用step命令。
66 1
通过例子学习在golang中调试程序
|
5月前
|
SQL NoSQL Go
技术经验分享:Golang标准库:errors包应用
技术经验分享:Golang标准库:errors包应用
40 0
|
5月前
|
移动开发 Go
golang bufio包怎么用?
`bufio` 是 Go 语言中用于提高 I/O 性能的包,它通过使用缓冲区减少对低效磁盘 I/O 操作的调用。简而言之,`bufio` 提供带缓冲的读写功能,减少读取或写入文件时的系统调用次数,从而提升程序性能。