Go 字符串的本质是[]byte
,如果想基于字节来处理字符串,或者是想处理其他来源的[]byte
,可以使用bytes
包。
因为 Go 字符串本质上就是一组 Unicode 码的 UTF-8 编码字节,bytes
与strings
包中提供的函数,有着很大的相似性,只不过前者针对[]byte
,后者针对string
…唔…好像在说废话…也就是说…尽管两者提供的函数在名称上有重叠,除了函数上的参数或返回类型不同之外,两者处理的粒度等也不同,例如 Compare,一个是逐一比较字节,另一个是逐一比较 Unicode 码。
类似地,对于频繁性的字符串操作,可以使用strings.Builder
,对于对于频繁性的字节操作,可以使用bytes.Buffer
:
type Buffer
func NewBuffer(buf []byte) *Buffer
func NewBufferString(s string) *Buffer
func (b *Buffer) Bytes() []byte
func (b *Buffer) Cap() int
func (b *Buffer) Grow(n int)
func (b *Buffer) Len() int
func (b *Buffer) Next(n int) []byte
func (b *Buffer) Read(p []byte) (n int, err error)
func (b *Buffer) ReadByte() (byte, error)
func (b *Buffer) ReadBytes(delim byte) (line []byte, err error)
func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error)
func (b *Buffer) ReadRune() (r rune, size int, err error)
func (b *Buffer) ReadString(delim byte) (line string, err error)
func (b *Buffer) Reset()
func (b *Buffer) String() string
func (b *Buffer) Truncate(n int)
func (b *Buffer) UnreadByte() error
func (b *Buffer) UnreadRune() error
func (b *Buffer) Write(p []byte) (n int, err error)
func (b *Buffer) WriteByte(c byte) error
func (b *Buffer) WriteRune(r rune) (n int, err error)
func (b *Buffer) WriteString(s string) (n int, err error)
func (b *Buffer) WriteTo(w io.Writer) (n int64, err error)
创建Buffer
时可以使用NewBuffer
指定初始化的字节大小,如果你想要处理的是字符串的 UTF-8 字节,可以使用NewBufferString
。例如,来简单地针对中文做百分比编码:
package main
import (
"fmt"
"bytes"
"strings"
)
func encodeURI(s string) string {
buf := bytes.NewBufferString(s)
var builder strings.Builder
for {
b, e := buf.ReadByte()
if e != nil {
break
}
builder.WriteString(fmt.Sprintf("%%%X", b))
}
return builder.String()
}
func main() {
fmt.Println(encodeURI("良葛格")) // %E8%89%AF%E8%91%9B%E6%A0%BC
}
类似地,你也可以透过bytes.Reader
,将[]byte
作为来源读取:
type Reader
func NewReader(b []byte) *Reader
func (r *Reader) Len() int
func (r *Reader) Read(b []byte) (n int, err error)
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
func (r *Reader) ReadByte() (byte, error)
func (r *Reader) ReadRune() (ch rune, size int, err error)
func (r *Reader) Reset(b []byte)
func (r *Reader) Seek(offset int64, whence int) (int64, error)
func (r *Reader) Size() int64
func (r *Reader) UnreadByte() error
func (r *Reader) UnreadRune() error
func (r *Reader) WriteTo(w io.Writer) (n int64, err error)