gpt4 book ai didi

go - 从 JSON 字符串中恢复满足定义接口(interface)的结构

转载 作者:IT王子 更新时间:2023-10-29 02:09:38 25 4
gpt4 key购买 nike

我正在实现一个任务轮询器(从数据库中恢复未完成的任务)。

任务必须满足定义的Task接口(interface):

type Task interface {
// Identifier returns a unique string of a task
Identifier() string
// Data should be persistent
Data() interface{}
// Execute a task
Execute()
}

数据库中存储的数据满足以下结构:

type Record struct {
Identifier string `json:"identifier"`
Data interface{} `json:"data"`
}

当任务轮询器启动时,它会从数据库中读取存储的数据,然后(我们暂时忽略错误处理):

r := &Record{}
result := database.Get(key)
json.Unmarshal([]byte(result), r)

我们将保存的数据从数据库恢复到r

出现了一个问题,我无法调用 Execute() 方法,因为 r.Data 实际上是 interface{} 的类型(map[string]interface{} 更具体地说 ) 而不是 Task 的类型。

如何转换或转换 r.Data 成为满足 Task 接口(interface)的结构,以便我可以成功调用 Execute() 方法?

最佳答案

r.Data is actually type of interface{} (map[string]interface{} more specifically).

您需要一个满足Task 接口(interface)的方法集。例如,

package main

import "fmt"

type Task interface {
// Identifier returns a unique string of a task
Identifier() string
// Data should be persistent
Data() interface{}
// Execute a task
Execute()
}

type Record struct {
Identifier string `json:"identifier"`
Data interface{} `json:"data"`
}

type Data map[string]interface{}

// Task interface methods
func (d Data) Identifier() string { return "" }
func (d Data) Data() interface{} { return nil }
func (d Data) Execute() { fmt.Println("Execute()") }

func main() {
r := Record{Data: map[string]interface{}{}}
fmt.Printf("r.Data: %[1]T %[1]v\n", r.Data)
if m, ok := r.Data.(map[string]interface{}); ok {
r.Data = Data(m)
}

var tasks []Task
if task, ok := r.Data.(Task); ok {
tasks = append(tasks, task)
}

for _, task := range tasks {
fmt.Printf("%T: ", task)
task.Execute()
}
}

Playground :https://play.golang.org/p/SC9Ff8e-_pP

输出:

r.Data: map[string]interface {} map[]
main.Data: Execute()

关于go - 从 JSON 字符串中恢复满足定义接口(interface)的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51117781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com