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.

Reply via email to