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