使用兼容接口进行 panic 接口转换

Go panic interface conversion with a compatible interface

我几个小时都面临着无法支持的问题,我必须解码来自以太坊智能合约调用的数据(但这不是主题,因为这部分有效)但我将这些数据恢复到 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”,但我没有找到任何解决它的技巧(事实上,我不确定问题是否真的存在来自那个)。

如果有人有想法,你会让我的大脑免于在地狱中燃烧。 谢谢

接口的值类型为 struct { SrcToken ...}。它是一个未命名的类型。类型断言仅在类型相同或断言类型是接口且底层接口类型实现该接口时才有效。您尝试转换为的类型不是接口,而是结构。所以你可以这样做:

value:=data.(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"` })

有了这个之后,您可以使用以下方法将 value 转换为您想要的类型:

targetValue:=oneinch.OneInchSwapDataDesc(value)