登录
首页 >  Golang >  Go问答

在使用 GO 编写的 Hyperledger 链码中返回泛型类型的实例

来源:stackoverflow

时间:2024-02-28 11:18:26 335浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《在使用 GO 编写的 Hyperledger 链码中返回泛型类型的实例》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

在我的项目中,我使用了一个包装器结构,其定义类似于:

type wrapper[t any] struct {
   foo  int
   data t
}

此外,我的链码提供了具有以下签名的方法

func(contract *mycontract) dosomething() *wrapper[mypkg.bar]

其中 bar 是定义的简单结构 - 例如 - 如下所示:

package mypkg

struct bar {
  foo string
  bar string
}

无论如何,如果我尝试部署我的链代码,我会收到以下错误:

error compiling schema for mycontract[dosomething]. return schema invalid. object has no key 'wrapper[[]'

奇怪的是,模块名称>的wrapper[[]<部分的部分被裁剪了。因此,仅显示了模块名称的一部分,并且如您所见,括号是错误的:缺少第二个右括号(所以这不是我犯的错误)。我的模块的名称是 github 存储库的链接。

我尝试通过创建结构来手动将 wrapper 中的泛型类型 t 替换为 bar

type wrapperbar struct {
  foo int
  data bar
}

如果我现在将函数签名调整为

func(contract *MyContract) DoSomething() *WrapperBar

它工作得很好。不幸的是,我多次使用结构 wrapper 类型实例化。因此,尽管手动创建所有类型是一种解决方法,但它显然不是一个非常优雅的方法。

是否有其他解决方法,以便我仍然可以使用通用 wrapper 结构? 我目前使用 go 版本 1.18fabric-contract-api-go 版本 v1.1.1


正确答案


Go 合约 API 目前不支持 Go 泛型,我可以建议的唯一解决方法是您在这个问题中尝试过的解决方法,或者在不使用合约 API 的情况下编写链代码,有一个示例这里 https://github.com/hyperledger/fabric-samples/tree/main/chaincode/marbles02/go 是一个不使用contract-api的实现。 您的实现必须在链代码中做更多工作,例如提供您自己的方法分派、验证和解组输入数据

您可以拨打 https://github.com/hyperledger/fabric-contract-api-go 提出问题,最好也贡献一个 PR 来解决此问题,因为我无法说明何时或是否会支持此功能。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在使用 GO 编写的 Hyperledger 链码中返回泛型类型的实例》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>