Golang中如何将自定义结构体的部分内容拷贝到另一个结构体
优雅提取ERC20转账数据的Go实现
结构体定义(参考你的业务场景)
// GetERC20TransferResponse 接口返回的顶层结构体 type GetERC20TransferResponse struct { TransferType string `json:"transferType"` // 示例类型:"incoming"/"outgoing"/"all" Data struct { Items struct { Transfers []Transfer `json:"transfers"` // 目标数据切片 // 其他业务字段... } `json:"items"` // 其他数据字段... } `json:"data"` // 其他顶层字段... } // Transfer 提取后的转账数据结构体 type Transfer struct { From string `json:"from"` To string `json:"to"` Value string `json:"value"` // 其他转账相关字段... }
核心实现函数
通过一个函数同时完成类型判断和数据提取,避免重复访问嵌套结构体:
// ExtractTransfers 一次性返回转账类型和对应的Transfers切片 func ExtractTransfers(resp *GetERC20TransferResponse) (string, []Transfer) { if resp == nil { return "", nil } // 仅读取一次嵌套字段,减少内存访问开销 transfers := resp.Data.Items.Transfers return resp.TransferType, transfers }
使用示例
func main() { // 假设已从接口获取到resp实例 resp := &GetERC20TransferResponse{ TransferType: "incoming", Data: struct { Items struct { Transfers []Transfer } }{ Items: struct{ Transfers []Transfer }{ Transfers: []Transfer{ {From: "0xaaa...", To: "0xbbb...", Value: "1000000000000000000"}, // 更多转账数据... }, }, }, } transferType, transfers := ExtractTransfers(resp) // 根据类型执行对应业务操作 switch transferType { case "incoming": saveIncomingTransfers(transfers) case "outgoing": saveOutgoingTransfers(transfers) case "all": saveAllTransfers(transfers) default: log.Printf("未知转账类型: %s", transferType) } } // 示例存储函数(按需实现业务逻辑) func saveIncomingTransfers(transfers []Transfer) { // 业务逻辑代码... }
方案优势
- 性能优化:仅一次读取嵌套的
Transfers字段,避免重复遍历深层结构体 - 代码简洁:调用方无需重复操作,通过一个函数获取所有必要信息
- 职责清晰:函数专注于类型判断和数据提取,业务逻辑与数据解耦分离
内容的提问来源于stack exchange,提问作者SelfLearnedNoob
相关产品推荐
相关产品推荐

