Then I should deal with the encoding of all the envelope fields. This envelope seems to be simple, but i got a more complicated one in the real dev works.
在 2016年12月16日星期五 UTC+8上午10:44:27,ma...@influxdb.com写道: > > > > On Thursday, December 15, 2016 at 6:05:53 PM UTC-8, Peng Wang wrote: >> >> Actually I don't really care about that, just don't want break the >> interface requirement >> in the doc it says "WriteAt writes len(p) bytes from p to the underlying >> data stream at offset off. It returns the number of bytes written from p (0 >> <= n <= len(p)) and any error encountered that caused the write to stop >> early." >> but using binary.Write I lost that infomation. So what's the right way to >> do it ? or just ignore it and return 0? >> >> 在 2016年12月16日星期五 UTC+8上午4:56:12,Tamás Gulácsi写道: >>> >>> 2016. december 15., csütörtök 17:36:47 UTC+1 időpontban 彭望 a következőt >>> írta: >>>> >>>> Hi all, I'm doing a simple message serialization, message defines like >>>> below: >>>> type Envelope struct { >>>> Magic uint32 >>>> DataSize uint32 >>>> } >>>> >>>> type Message struct { >>>> Envelope >>>> Data []byte >>>> } >>>> >>>> and I want to implement the io.WriterTo interface for Message >>>> func (m *Message) WriteTo(w io.Writer) (n int64, err error) { >>>> err = binary.Write(w, binary.BigEndian, &m.Envelope) >>>> if err != nil { >>>> // here, how should I return a proper n? Since w maybe >>>> *net.TCPConn and binary.Write maybe write 1 bytes and peer has dropped the >>>> connection. >>>> return 0, fmt.Errorf("Write message envelope error: %s", err) >>>> } >>>> >>>> // multiple lines skipped >>>> } >>>> >>> >>> If you really want to know the number of bytes written, wrap w in a >>> counting writer, which counts the bytes written. >>> >>>> type countingWriter struct { >>>> w io.Writer >>>> N int64 >>>> } >>>> func (w *countingWriter) Write(p []byte) (int, error) { >>>> n, err := w.w.Write(p) >>>> w.N += int64(n) >>>> return n, err >>>> } >>>> >>> >>> >> > You know the size of Envelope, so you can write it to a local byte slice > first and then pass that byte slice to w.Write. > > https://play.golang.org/p/WZmxCjgQVm > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.