性能非常强悍我自己写的版本始终没干过它。在我的新版推出以前vtprotobuf 可以算是 golang 领域最快的 protobuf 库。为什么我就比不过它呢我看到了这样的看不懂的代码func (m *Child) MarshalToSizedBufferVT(dAtA []byte) (int, error) {if m nil {return 0, nil}i : len(dAtA)_ ivar l int_ lif len(m.ChildName) 0 {i - len(m.ChildName)copy(dAtA[i:], m.ChildName)i protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ChildName)))i–dAtA[i] 0x12}if m.ChildId ! 0 {i protohelpers.EncodeVarint(dAtA, i, uint64(m.ChildId))i–dAtA[i] 0x8}return len(dAtA) - i, nil}可以发现这个库的特点是 先对数组的尾部赋值然后下标向前偏移然后再对数组首部进行赋值。难道这样就会变快Yes!下面我就拆解一下变快的原因先看下面的两个函数func f1(arr []byte) {arr[0] 1arr[9] 2}func f2(arr []byte) {arr[9] 2arr[0] 1}功能完全一样只是顺序不同。下面用命令行来检查数组越界检查go tool compile -dssa/check_bce/debug1 bce.go可以发现func f1(arr []byte) {arr[0] 1 // 仍有 bounds checkarr[9] 2 // 仍有 bounds check}func f2(arr []byte) {arr[9] 2 // 仍有 bounds checkarr[0] 1 // 没有 Found说明这个检查被消掉了}由此说明如果先出现了比较大的下标再出现小的下标那么编译器就能推断后续的数组访问一定没越界由此便不再产生越界检查的代码。从 golang 源码本身也能发现证据Go 编译器源码证据主要在 cmd/compile/internal/ssa/prove.go。OpIsInBounds 表示