软件定制语言Go原本的协定缓衝区套件已经发布了十年,但是随著使用者需求的成长,该套件也越来越不敷使用,不少软件定制开发者使用Go反射套件,撰写程式来检查协定缓衝区的讯息,但是因为反射套件只可检视Go的类型和数值,会忽略来自协定缓衝区类型系统的资讯。当软件定制开发者撰写一个走访日志项目,并且清除所有注释栏位中敏感资料的函式,但是因为注释栏位并非Go类型系统的一部分,所以处理起来就比较麻烦。
除此之外,软件定制开发者也有使用动态讯息类型这类,非由协定缓衝区编译器产生的资料结构的需求。proto.Message介面也常是问题的来源,虽然该介面会辨识生成讯息类型的值,但是却几乎没有描述这些类型的行为,因此当用户创建实作介面的类型,并将类型数值传递给函式,想要取得生成讯息值时,便常出现程式崩溃或是不可预期的行为。造成这三个问题的原因相同,而共同的解决方法,就是Message介面应该完全指定讯息的行为,而且操作Message值的函式,应该接受任何正确实作该介面的类型。由于无法在不改动Message类型现有定义的情况下,维持套件API的相容性,因此Go官方决定发布全新协定缓衝区模组,且新版本不与旧版本相容。