gpt4 book ai didi

go - 接口(interface)的复制或新实例

转载 作者:IT王子 更新时间:2023-10-29 01:55:47 28 4
gpt4 key购买 nike

我有一个接受接口(interface)并返回接口(interface)的函数。它想将结果初始化为源的副本,然后进行一些更改,并返回结果。例如:

Playground

type Something interface {
CopySomething() Something // I'd like to get rid of this
SetX(x int)
}

type RealThing struct {
x int
}

func (t *RealThing) SetX(x int) {
t.x = x
}

func (t *RealThing) CopySomething() Something {
newT := *t
return &newT
}

func Updated(original Something, newX int) Something {
newThing := original.CopySomething() // I'd like to make the copy without .CopySomething()
newThing.SetX(newX)
return newThing
}

func main() {
a := &RealThing{x: 1}
b := Updated(a, 5)
fmt.Printf("a = %v\n", a)
fmt.Printf("b = %v\n", b)
}

这行得通,但是 CopySomething() 方法似乎是不必要的(而且我需要为每个需要复制内容的接口(interface)使用另一个相同的方法)。有没有更好的方法可以在 Updated() 中复制 original 而无需额外的方法?是否有一些更惯用的方法来实现这一目标?

在我正在处理的特定情况下,我可以通过实例化一个与 original 相同类型的新实例来摆脱困境(我真的不需要副本)。这样问题是不是更简单了?


根据 Evan 的评论,我想我会给出一些我已经尝试过的其他基于反射的东西:

newThing := reflect.New(reflect.TypeOf(original))

==>编译错误:类型 reflect.Value 没有字段或方法 SetX

newThing := reflect.New(reflect.TypeOf(original)).Interface().(Something)

===>运行时错误:接口(interface)转换:**main.RealThing 不是 main.Something

newThing := reflect.Indirect(reflect.New(reflect.TypeOf(original))).Interface().(Something)

===>运行时错误:无效内存地址或 nil 指针取消引用

在这一点上,我觉得我的倒影变得很傻,不再继续敲打它了。

最佳答案

由于您只需要实例化一个新实例,您可以使用反射来获取存储在界面中的对象的类型,并以这种方式实例化一个副本。像 reflect.New(reflect.TypeOf(x)) 这样的东西,尽管你可能不得不使用 reflect.Indirect() 来分配一个新值而不是一个新值指针。

全部记录在此处:http://golang.org/pkg/reflect/

还有一个可运行的版本:http://play.golang.org/p/z8VPzDKrSk

关于go - 接口(interface)的复制或新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22948133/

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