Go编程技巧--io.Reader/Writer
总览
围绕
这些实现对于初学者来说其实比较难去记忆,在遇到实际问题的时候更是一脸蒙圈,不知如何是好。下面用实际的场景来举例 场景举例0. base64编码成字符串
func NewEncoder(enc *Encoding,w io.Writer) io.WriteCloser 这个用来做 input := []byte("foox00bar") encoder := base64.NewEncoder(base64.StdEncoding,os.Stdout) encoder.Write(input) 这个例子是将结果写入到 input := []byte("foox00bar") buffer := new(bytes.Buffer) encoder := base64.NewEncoder(base64.StdEncoding,buffer) encoder.Write(input) fmt.Println(string(buffer.Bytes()) 1. []byte和struct之间正反序列化这种场景经常用在基于字节的协议上,比如有一个具有固定长度的结构: type Protocol struct { Version uint8 BodyLen uint16 Reserved [2]byte Unit uint8 Value uint32 } 通过一个 func Read(r io.Reader,order ByteOrder,data interface{}) error 这个方法从一个 var p Protocol var bin []byte //... binary.Read(bytes.NewReader(bin),binary.LittleEndian,&p) 换句话说,我们将一个 反过来,我们需要将 func Write(w io.Writer,data interface{}) error 通过将 var p Protocol buffer := new(bytes.Buffer) //... binary.Writer(buffer,p) bin := buffer.Bytes() 2. 从流中按行读取比如对于常见的基于文本行的 func NewReader(rd io.Reader) *Reader func (b *Reader) ReadString(delim byte) (string,error) 这个ReadString方法从 var conn net.Conn //... reader := NewReader(conn) for { line,err := reader.ReadString([]byte('n')) //... } 花式技(zuo)巧(si)string转[]bytea := "Hello,playground" fmt.Println([]byte(a)) 等价于 a := "Hello,playground" buf := new(bytes.Buffer) buf.ReadFrom(strings.NewReader(a)) fmt.Println(buf.Bytes()) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |