Go 中接口值的深拷贝
直接在 Go 中复制接口值会产生浅拷贝,意味着对复制的内容进行更改值也会影响原始值。这是因为接口保存了对底层具体类型的引用。
名称更改的原因
为了理解所提供代码中的问题,让我们分析一下接口值的工作原理。用户界面代表一个契约,管理员和用户都实现这个契约。将 user1 分配给 user2 时,我们实际上是在创建对同一管理实例的引用。修改user2的Name()方法直接修改了共享的Admin实例,从而也改变了user1的名称。
反射解决方案
要实现深拷贝,我们需要创建底层具体类型的新实例并将其包装在新的用户界面值中。实现此目的的一种方法是使用反射。我们可以使用reflect.ValueOf()和reflect.Elem()函数来获取存储在user1中的底层值。然后,我们可以使用reflect.New()创建相同类型的新实例,并使用reflect.MethodByName()获取Name()方法。最后,我们可以在新实例上调用 SetName() 方法,并将其包装在新的用户界面值中。
func CloneUser(user User) User { val := reflect.ValueOf(user) if val.Kind() != reflect.Ptr { panic("expected pointer") } elem := val.Elem() t := elem.Type() newElem := reflect.New(t).Elem() newElem.MethodByName("SetName").Call([]reflect.Value{reflect.ValueOf(newElem.String())}) return newElem.Interface().(User) }
使用此函数,我们可以创建一个不影响原始实例的副本:
var user2 User = CloneUser(user1) user2.SetName("user2") fmt.Println(user1.Name(), user2.Name()) // Outputs: user1 user2
以上是Go中如何实现接口值的深拷贝?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用GO的“字符串”软件包进行字符串操作,详细介绍了共同的功能和最佳实践,以提高效率并有效地处理Unicode。

本文详细介绍了GO的“时间”包用于处理日期,时间和时区,包括获得当前时间,创建特定时间,解析字符串以及测量经过的时间。

文章讨论了使用GO的“同步/原子”软件包进行并发编程中的原子操作,详细说明了其益处,例如防止比赛条件和提高性能。

本文讨论了GO中的类型转换,包括语法,安全转换实践,常见的陷阱和学习资源。它强调明确的类型转换和错误处理。[159个字符]

本文解释了在GO中使用“选择”语句来处理多个频道操作的使用,其与“开关”语句的差异以及常见用例,例如处理多个渠道,实现超时,非B


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。