gpt4 book ai didi

go - 如何将 interface{} 转换回其原始结构?

转载 作者:IT王子 更新时间:2023-10-29 01:51:00 25 4
gpt4 key购买 nike

我需要一种方法来动态地将结构/接口(interface)转换回其原始对象。我可以在里面添加方法/函数。基本上我需要这样的东西:

MyStruct  =>  Interface{}  => MyStruct

在进行最终转换时,除了结构内部的内容外,我对原始结构一无所知,所以我不能这样:

a.(MyStruct)

最佳答案

您至少需要知道它可能的类型。有几个案例,1. 你认为你可能知道它是什么。 2. 你有一个可能的类型列表,3. 你的代码对底层类型一无所知。

  1. 如果您认为自己知道,可以使用类型断言将其转换回原始结构类型。

...

package main

import (
"fmt"
)

type MyStruct struct {
Thing string
}

func (s *MyStruct) Display() {
fmt.Println(s.Thing)
}

type Thingable interface {
Display()
}

func main() {
s := &MyStruct{
Thing: "Hello",
}

// print as MyThing
s.Display()

var thinger Thingable
thinger = s

// print as thingable interface
thinger.Display()

// convert thinger back to MyStruct
s2 := thinger.(*MyStruct) // this is "type assertion", you're asserting that thinger is a pointer to MyStruct. This will panic if thinger is not a *MyStruct

s2.Display()
}

您可以在此处查看实际效果:https://play.golang.org/p/rL12Lrpqsyu

请注意,如果你想测试类型而不是因为你错了而 panic ,请执行 s2, ok := thinger.(*MyStruct)。如果成功则 ok 为真,否则为假。

  1. 如果你想针对一堆类型测试你的接口(interface)变量,使用一个开关:(滚动到底部)

...

package main

import (
"fmt"
"reflect"
)

type MyStruct struct {
Thing string
}

type MyStruct2 struct {
Different string
}

func (s *MyStruct) Display() {
fmt.Println(s.Thing)
}

func (s *MyStruct2) Display() {
fmt.Println(s.Different)
}

type Thingable interface {
Display()
}

func main() {
s := &MyStruct{
Thing: "Hello",
}

// print as MyThing
s.Display()

var thinger Thingable
thinger = s

// print as thingable interface
thinger.Display()

// try to identify thinger
switch t := thinger.(type) {
case *MyStruct:
fmt.Println("thinger is a *MyStruct. Thing =", t.Thing)
case *MyStruct2:
fmt.Println("thinger is a *MyStruct2. Different =", t.Different)
default:
fmt.Println("thinger is an unknown type:", reflect.TypeOf(thinger))
}
}

您可以在这里尝试 https://play.golang.org/p/7NEbwB5j6Is

  1. 如果您真的对底层类型一无所知,您将不得不通过接口(interface)函数公开您需要的东西并调用它们。很可能您可以在不了解基础类型的情况下执行此操作。

关于go - 如何将 interface{} 转换回其原始结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660857/

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