php小编新一为您介绍如何将任何类型的数据值传递到Golang中的GRPC Protobuf结构中。GRPC Protobuf是一种高效的数据传输协议,但是默认情况下只支持有限的数据类型。然而,通过使用自定义的字段类型和值转换方法,我们可以轻松地将任何类型的数据值传递到Protobuf结构中。在本文中,我们将提供一些实用的技巧和示例代码,帮助您在Golang中处理各种数据类型的传递。无论是字符串、数字、布尔值还是自定义的复杂对象,都可以通过这些方法成功传递到GRPC Protobuf结构中。让我们一起来看看吧!
问题内容
我正在尝试通过 tonutils-go 解析 adnl 库中的数据并通过 grpc 传递数据。
我需要的数据结构为
// struct from tonutils-go type transaction struct { _ magic `tlb:"$0111"` accountaddr []byte `tlb:"bits 256"` lt uint64 `tlb:"## 64"` prevtxhash []byte `tlb:"bits 256"` prevtxlt uint64 `tlb:"## 64"` now uint32 `tlb:"## 32"` outmsgcount uint16 `tlb:"## 15"` origstatus accountstatus `tlb:"."` endstatus accountstatus `tlb:"."` io struct { in *message `tlb:"maybe ^"` out *messageslist `tlb:"maybe ^"` } `tlb:"^"` totalfees currencycollection `tlb:"."` stateupdate hashupdate `tlb:"^"` // of account description transactiondescription `tlb:"^"` // not in scheme, but will be filled based on request data for flexibility hash []byte `tlb:"-"` } type transactiondescription struct { description any `tlb:"."` } type transactiondescriptionordinary struct { _ magic `tlb:"$0000"` creditfirst bool `tlb:"bool"` storagephase *storagephase `tlb:"maybe ."` creditphase *creditphase `tlb:"maybe ."` computephase computephase `tlb:"."` actionphase *actionphase `tlb:"maybe ^"` aborted bool `tlb:"bool"` bouncephase *bouncephase `tlb:"maybe ."` destroyed bool `tlb:"bool"` } type computephase struct { phase any `tlb:"."` } type computephasevm struct { _ magic `tlb:"$1"` success bool `tlb:"bool"` msgstateused bool `tlb:"bool"` accountactivated bool `tlb:"bool"` gasfees coins `tlb:"."` details struct { gasused *big.int `tlb:"var uint 7"` gaslimit *big.int `tlb:"var uint 7"` gascredit *big.int `tlb:"maybe var uint 3"` mode int8 `tlb:"## 8"` exitcode int32 `tlb:"## 32"` exitarg *int32 `tlb:"maybe ## 32"` vmsteps uint32 `tlb:"## 32"` vminitstatehash []byte `tlb:"bits 256"` vmfinalstatehash []byte `tlb:"bits 256"` } `tlb:"^"` }
txtest的protobuf:
message txtest { int32 exitcode = 1; }
我要解析的数据是exitcode,代码如下:
list, err := api.listtransactions(context.background(), addr, 1, uint64(txinfo.txlt), data) if err != nil { log.printf("send err: %s", err.error()) return nil, err } for _, t := range list { a := t.description.description var result tlb.transactiondescriptionordinary b, err := json.marshalindent(a, "", " ") if err != nil { fmt.println("error:", err) } json.unmarshal([]byte(string(b)), &result) var computephase tlb.computephasevm c, err := json.marshalindent(result.computephase.phase, "", " ") if err != nil { fmt.println("error:", err) } json.unmarshal([]byte(string(c)), &computephase) detail := &pb.txtest{ exitcode: computephase.details.exitcode, } detail2 := struct { exitcode int32 `json:"exit_code"` }{ exitcode: computephase.details.exitcode, } fmt.printf("detail: %+v\n", detail) fmt.printf("detail2: %+v\n", detail2) }
一笔交易的数据结构为:
{ "accountaddr": "hymm1/kk6gb2dlv3zvkiryepkohrtf/jg8k7ttg91sq=", "lt": 11898016000001, "prevtxhash": "ikgjsxdt0gzijxgnilvxy0+a1ggeqded4f7zaj9dlmc=", "prevtxlt": 11897712000001, "now": 1685602760, "outmsgcount": 1, "origstatus": "active", "endstatus": "active", "io": { "in": { "msgtype": "external_in", "msg": { "srcaddr": "none", "dstaddr": "eqadiyzx-qroyhymtxfnwqhhiskqgdfmx-mbwru1mb3wxn5d", "importfee": "0", "stateinit": null, "body": {} } }, "out": { "list": {} } }, "totalfees": { "coins": "22324812", "extracurrencies": {} }, "stateupdate": { "oldhash": "wukexyos8hswyqyrlhpmjhpfmusid8odtaq6fy20pyq=", "newhash": "e8tn4cp4lakfwvdcgc/vqbz7lzeb4mhjmbrfe8rpsqa=" }, "description": { "description": { "creditfirst": true, "storagephase": { "storagefeescollected": "484", "storagefeesdue": null, "statuschange": { "type": "unchanged" } }, "creditphase": null, "computephase": { "phase": { "success": true, "msgstateused": false, "accountactivated": false, "gasfees": "19862000", "details": { "gasused": 19862, "gaslimit": 0, "gascredit": 10000, "mode": 0, "exitcode": 0, "exitarg": null, "vmsteps": 404, "vminitstatehash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=", "vmfinalstatehash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=" } } }, "actionphase": { "success": true, "valid": true, "nofunds": false, "statuschange": { "type": "unchanged" }, "totalfwdfees": "1000000", "totalactionfees": "333328", "resultcode": 0, "resultarg": null, "totalactions": 1, "specactions": 0, "skippedactions": 0, "messagescreated": 1, "actionlisthash": "fkoo2xx9ju4yxtgjlrujvayrrwtryhebkuywuyg9av4=", "totalmsgsize": { "cells": 1, "bits": 697 } }, "aborted": false, "bouncephase": null, "destroyed": false } }, "hash": "vmxfrkfietmaihm3brtvhskaide1ckgrw8rqbvarjtq=" }
detail
和 detail2
的输出为:
detail: detail2: {ExitCode:0}
我的问题是为什么 protoc
生成的结构无法从 transaction
解析 exitcode
但我定义的结构可以正常工作?
如何将数据注入到protoc
生成的struct txtest
中,让我通过grpc
传输数据?
解决方法
使用 0 以外的退出代码值尝试此操作,我猜您会得到不同的结果。
看看您生成的代码。我相信发生的事情是 fmt.Printf
正在为您的原型结构调用生成的 String()
方法,它使用 prototext
包来打印消息的内容,而不是默认的 Go 结构打印机。
这是 proto3
的预期行为; int32
值 0
和空字段之间没有区别。
以上是如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf 结构中?的详细内容。更多信息请关注PHP中文网其他相关文章!

Golang在实际应用中表现出色,以简洁、高效和并发性着称。 1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go语言的核心特性包括垃圾回收、静态链接和并发支持。1.Go语言的并发模型通过goroutine和channel实现高效并发编程。2.接口和多态性通过实现接口方法,使得不同类型可以统一处理。3.基本用法展示了函数定义和调用的高效性。4.高级用法中,切片提供了动态调整大小的强大功能。5.常见错误如竞态条件可以通过gotest-race检测并解决。6.性能优化通过sync.Pool重用对象,减少垃圾回收压力。

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

关于SQL查询结果排序的疑惑学习SQL的过程中,常常会遇到一些令人困惑的问题。最近,笔者在阅读《MICK-SQL基础�...

golang ...

Go语言中如何对比并处理三个结构体在Go语言编程中,有时需要对比两个结构体的差异,并将这些差异应用到第�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

记事本++7.3.1
好用且免费的代码编辑器

Dreamweaver Mac版
视觉化网页开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版