`proto.Marshal` in fact does something very similar to `gob.Encode`. (The way gob works seems to be heavily inspired by the way protobufs work...) Since gob'ing a bytes buffer is very straightforward, I don't think it causes a lot of overhead. On the other side, the protobuf implementation might make use of some special protobuf properties gob can't know. (Not that I'm sure there are such, but it's not trivially clear which way will be more efficient. But we can trust the proto encoding to work, while gob might run into subtle errors, if not now than possibly later if the proto implementation changes... which would change or possibly break gob, while the wire format is well specified and will not change...)