【发布时间】:2021-09-20 00:54:31
【问题描述】:
几个小时以来我都面临着一个无法支持的问题,我必须从以太坊智能合约调用中解码数据(但这不是主题,因为这部分工作)但我将这些数据恢复到 interface{}。
当我想将这个空接口转换为我可以使用的结构时,我收到了这条消息:panic: interface conversion: interface {} is struct { SrcToken common.Address "json:\"srcToken\""; DstToken common.Address "json:\"dstToken\""; SrcReceiver common.Address "json:\"srcReceiver\""; DstReceiver common.Address "json:\"dstReceiver\""; Amount *big.Int "json:\"amount\""; MinReturnAmount *big.Int "json:\"minReturnAmount\""; Flags *big.Int "json:\"flags\""; Permit []uint8 "json:\"permit\"" }, not oneinch.OneInchSwapDataDesc
结构是:
type OneInchSwapDataDesc struct {
SrcToken common.Address
DstToken common.Address
SrcReceiver common.Address
DstReceiver common.Address
Amount *big.Int
MinReturnAmount *big.Int
Flags *big.Int
Permit []uint8
}
当我查找我得到的类型和数据值时:
fmt.Println("Type: ", reflect.TypeOf(data))
fmt.Printf("Data: %+v\n", data)
// Logs:
// Type: struct { SrcToken common.Address "json:\"srcToken\""; DstToken common.Address "json:\"dstToken\""; SrcReceiver common.Address "json:\"srcReceiver\""; DstReceiver common.Address "json:\"dstReceiver\""; Amount *big.Int "json:\"amount\""; MinReturnAmount *big.Int "json:\"minReturnAmount\""; Flags *big.Int "json:\"flags\""; Permit []uint8 "json:\"permit\"" }
// Data: {SrcToken:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 DstToken:0xc2132D05D31c914a87C6611C10748AEb04B58e8F SrcReceiver:0x11431a89893025D2a48dCA4EddC396f8C8117187 DstReceiver:0x2C2d6E5E16FE924cE31784cdAd27C01D1BC62873 Amount:+10000000 MinReturnAmount:+9949450 Flags:+4 Permit:[]}
我认为这个问题来自那些来自 TypeOf 的“json”,但我没有找到任何技巧来清除它(事实上,我不确定问题是否真的来自那个)。
如果有人有想法,你会拯救我的大脑免于在地狱中燃烧。 谢谢。
【问题讨论】:
-
结构体不是接口,结构体所包含的字段与接口无关,接口只有方法。
-
我认为你错了,空接口是任何类型的一种,因此它可以不仅仅是方法,还可以转换为结构或标量
-
我没看错。
interface{}可以“指向”任何东西,但这不会让你将它指向的东西“投射”到与接口无关的其他东西上。您可以从带有类型断言的接口中获取结构或其他具体类型,并且通过测试底层具体类型而不是通过“强制转换”形式来工作。 -
@LaGregance,类型断言不是强制转换。如果接口中对象的类型可分配给所断言的类型,则类型断言将起作用。有关“可分配性”的定义,请参阅:golang.org/ref/spec#Assignability
-
感谢您的澄清,这会有所帮助;)
标签: go go-ethereum