package main import ( "encoding/binary" "io" "log" ) func mustWrite(w io.Writer, buf []byte) { if _, err := w.Write(buf); err != nil { log.Fatalln(err) } } func writer(w io.Writer, sink chan Ent) { num := make([]byte, 8) var name string for ent := range sink { name = ent.name[len(ent.name)-1] if len(ent.name) >= 1<<16 { panic("too long") } binary.BigEndian.PutUint16(num[:2], uint16(len(name))) mustWrite(w, num[:2]) mustWrite(w, []byte(name)) if len(ent.name) >= 1<<8 { panic("too deep") } mustWrite(w, []byte{byte(len(ent.name) - 1)}) binary.BigEndian.PutUint64(num, uint64(ent.mtime)) mustWrite(w, num) binary.BigEndian.PutUint64(num, uint64(ent.size)) mustWrite(w, num) } }