当前位置:网站首页>【 protobuf 】 quelques puits causés par la mise à niveau de protobuf
【 protobuf 】 quelques puits causés par la mise à niveau de protobuf
2022-06-26 20:57:00 【Impression de Manon】
Il y a quelque temps, l'entreprise s'est appuyée sur un projet github.com/golang/protobuf La version de v1.3.3 Mise à jour vers v1.4.2,Cet article documente certains des problèmes rencontrés lors de la mise à niveau.
Google C'est exact. Go De protobuf Le rez - de - chaussée de la Bibliothèque a été considérablement amélioré,La nouvelle version du chemin du paquet a été transférée à google.golang.org/protobuf.
En même temps,Ces améliorations ont également été apportées à github.com/golang/protobuf:De v1.4 Depuis la version,github.com/golang/protobuf Il sera là. google.golang.org/protobuf Basé sur,Mais la compatibilité des interfaces sera garantie,Cela indique également la dépendance actuelle github.com/golang/protobuf Les projets de,Sans modification du Code supérieur.
Et pourtant,Nouvelle édition de protobuf-gen-go Utilisé google.golang.org/protobuf/protoreflect,Compilé message La structure est complètement différente de ce qu'elle était avant,Cela a causé des problèmes dans notre travail de mise à niveau.
1. Dans le Code XXX_Unmarshal Appel direct de
Ancienne version protoc-gen-go Ça va exposer un XXX_Unmarshal Interface,Utilisé dans proto.Unmarshal Appelé à, Certains collègues ont donc choisi d'appeler directement message.XXX_Unmarshal Méthodes.Nouvelle édition de proto Adoption ProtoReflect Exposition à l'interface message Information interne,Compiler pb.go Il n'y a plus de temps XXX_Unmarshal Méthodes, Il en résulte une erreur de temps de compilation message.XXX_Unmarshal undefined.
La solution est simple:Utilisez plutôt proto.Unmarshal C'est tout..
2. Erreur d'essai due à un changement de structure à l'intérieur de la structure
Pour le même message, La structure de l'ancienne version compilée est la suivante :
type HealthCheckResponse struct {
Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=liulishuo.common.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
XXX_NoUnkeyedLiteral struct{
} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
Et la nouvelle version est construite comme suit :
type HealthCheckResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=liulishuo.common.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
}
Je vois., Trois champs non exportés ont été ajoutés à la nouvelle version , Et ces trois champs ont causé des problèmes avec notre Code de test .
- cmp.Equal Heure panic
Nous avons utiliségithub.com/google/go-cmp/cmp.EqualC'est ça. proto Comparaison des structures , Et les champs non exportés dans la structure fontcmp.EqualEtcmp.Diffpanic:
panic: cannot handle unexported field at {
*pkg.SomeRequest}.state:
".../services_go_proto".SomeRequest
consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported [recovered]
go-cmp La façon recommandée est d'utiliser IgnoreUnexported, Mais de cette façon, vous devez passer tous les types que vous voulez ignorer , Pour les message Très hostile..
Après une recherche,Découverte protocmp.Transform Peut mettre tous les protobuf message Convertir en personnalisé map[string]interface{} Comparer,Pour que nous puissions utiliser Transform() Pour résoudre le problème:
import "google.golang.org/protobuf/testing/protocmp"
// ...
opt := protocomp.Trnasform()
if !cmp.Equal(exp, got, opt) {
t.Error(exp, got, opt)
}
- assert Coincé et plein de mémoire
Comparé à la question ci - dessus , Les questions suivantes sont encore plus étranges :Utilisergithub.com/stretchr/testify/assert.EqualComparer certains proto message Ça va se coincer., Pendant ce temps, l'utilisation de la mémoire augmente .
Essayez d'utiliser pprof Échantillonnage,C'est sorti. CPU Et la longueur de la carte d'échantillonnage du tas :


Je vois. spew.Dump Il y a une récursion infinie , Cela a entraîné une saisie du programme et une allocation continue de mémoire .
Je l'ai trouvé. testify De issue, Plusieurs solutions de contournement sont proposées dans les commentaires pertinents , Mais ce problème n'a pas encore été résolu .
Il existe deux solutions recommandées par les particuliers :
- Utiliser
marshalTextString()Oui. message Convertir en proto text,Puis comparez; - Utiliser
cmp.Equal,Unionprotocmp.Transform.
3. lint Erreur signalée copylocks
Traitement du test de traitement du Code d'entreprise terminé , Après le traitement du Code d'essai et lint À traiter.
Après la mise à niveau de notre projet ,go vet Le journal copylocks Erreur:assignment copies lock value to got: .../message_go_protos.Message contains google.golang.org/protobuf/internal/impl.MessageState contains sync.Mutex
La solution est aussi plus simple :Tout proto message Passer au pointeur à la place .
边栏推荐
- When are global variables initialized before entering the main function?
- C language simple login
- C primer plus learning notes - 3. Character IO (input / output)
- Mongodb implements creating and deleting databases, creating and deleting tables (sets), and adding, deleting, modifying, and querying data
- C: 反转链表
- 710. 黑名单中的随机数
- 定长内存池
- MongoDB实现创建删除数据库、创建删除表(集合)、数据增删改查
- Arrête d'être un bébé géant.
- The postgraduate entrance examination in these areas is crazy! Which area has the largest number of candidates?
猜你喜欢

Looking back at the moon

基于QT开发的线性代数初学者的矩阵计算器设计
![[Bayesian classification 3] semi naive Bayesian classifier](/img/9c/070638c1a613be648466e4f2bc341e.png)
[Bayesian classification 3] semi naive Bayesian classifier

Idea error: process terminated

How to install mysql8.0 database under Windows system? (Graphic tutorial)

Leetcode question brushing: String 06 (implement strstr())

mongoDB的三种基础备份方法

Leetcode question brushing: String 01 (inverted string)

【贝叶斯分类2】朴素贝叶斯分类器

飞天+CIPU体为元宇宙带来更大想象空间
随机推荐
MySQL - database creation and management
[serial] shuotou O & M monitoring system 01 overview of monitoring system
SentinelResource注解詳解
Development of NFT for digital collection platform
710. random numbers in the blacklist
[Shandong University] information sharing for the first and second examinations of postgraduate entrance examination
清华大学就光刻机发声,ASML立马加紧向中国出口光刻机
JWT operation tool class sharing
手机股票注册开户有没有什么风险?安全吗?
基于QT实现简单的连连看小游戏
Arrête d'être un bébé géant.
Sword finger offer II 091 Paint the house
Daily basic use of alicloud personal image warehouse
Arduino UNO + DS1302利用31字节静态RAM存储数据并串口打印
leetcode刷题:哈希表08 (四数之和)
回首望月
Review of watermelon book (VII): Bayesian classifier (manual push + code demo)
[Bayesian classification 4] Bayesian network
Can I open an account online? Is it safe?
The relationship between the development of cloud computing technology and chip processor