I won't remove the bufio.Buffer for Marshal now, it isn't a performance issue as far as I can tell, and I'd have to fake Flush().
 // error if any.
 func Marshal(v interface{}) ([]byte, error) {
        var buf bytes.Buffer
-       e := Encoder{Writer: bufio.NewWriter(&buf)}
+       e := Encoder{w: bufio.NewWriter(&buf)}
        err := e.Encode(v)
        if err != nil {
                return nil, err
 }
 
 func NewEncoder(w io.Writer) *Encoder {
-       return &Encoder{Writer: bufio.NewWriter(w)}
+       return &Encoder{w: bufio.NewWriter(w)}
 }
 
 package bencode
 
 import (
-       "bufio"
+       "io"
        "reflect"
        "runtime"
        "sort"
 }
 
 type Encoder struct {
-       *bufio.Writer
+       w interface {
+               Flush() error
+               io.Writer
+               WriteString(string) (int, error)
+       }
        scratch [64]byte
 }
 
                }
        }()
        e.reflect_value(reflect.ValueOf(v))
-       return e.Flush()
+       return e.w.Flush()
 }
 
 type string_values []reflect.Value
 func (sv string_values) get(i int) string   { return sv[i].String() }
 
 func (e *Encoder) write(s []byte) {
-       _, err := e.Write(s)
+       _, err := e.w.Write(s)
        if err != nil {
                panic(err)
        }
 }
 
 func (e *Encoder) write_string(s string) {
-       _, err := e.WriteString(s)
+       _, err := e.w.WriteString(s)
        if err != nil {
                panic(err)
        }