搜索
首页后端开发Golang如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf 结构中?

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf 结构中?

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="
}

detaildetail2 的输出为:

detail: 
detail2: {ExitCode:0}

我的问题是为什么 protoc 生成的结构无法从 transaction 解析 exitcode 但我定义的结构可以正常工作?

如何将数据注入到protoc生成的struct txtest中,让我通过grpc传输数据?

解决方法

使用 0 以外的退出代码值尝试此操作,我猜您会得到不同的结果。

看看您生成的代码。我相信发生的事情是 fmt.Printf 正在为您的原型结构调用生成的 String() 方法,它使用 prototext 包来打印消息的内容,而不是默认的 Go 结构打印机。

这是 proto3预期行为int320 和空字段之间没有区别。

以上是如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf 结构中?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:stackoverflow。如有侵权,请联系admin@php.cn删除
Golang行动:现实世界中的示例和应用程序Golang行动:现实世界中的示例和应用程序Apr 12, 2025 am 12:11 AM

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

Golang:Go编程语言解释了Golang:Go编程语言解释了Apr 10, 2025 am 11:18 AM

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

Golang的目的:建立高效且可扩展的系统Golang的目的:建立高效且可扩展的系统Apr 09, 2025 pm 05:17 PM

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

SQL排序中ORDER BY语句结果为何有时看似随机?SQL排序中ORDER BY语句结果为何有时看似随机?Apr 02, 2025 pm 05:24 PM

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

技术栈收敛是否仅仅是技术栈选型的过程?技术栈收敛是否仅仅是技术栈选型的过程?Apr 02, 2025 pm 05:21 PM

技术栈收敛与技术选型的关系在软件开发中,技术栈的选择和管理是一个非常关键的问题。最近,有读者提出了...

如何在Go语言中使用反射对比并处理三个结构体的差异?如何在Go语言中使用反射对比并处理三个结构体的差异?Apr 02, 2025 pm 05:15 PM

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

在Go语言中如何查看全局安装的包?在Go语言中如何查看全局安装的包?Apr 02, 2025 pm 05:12 PM

在Go语言中如何查看全局安装的包?在使用Go语言开发过程中,经常会使用go...

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

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

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版