通过 Go 创建类型化值的新对象(go 1.18)泛型
在 Go 1.18 中使用泛型时,您可能会遇到需要创建一个通用函数中自定义类型的新实例。以下问题演示了这一挑战:
问题
在提供的代码示例中,FruitFactory 结构中的 Create 函数旨在创建类型 T 的新实例,但它当前返回 nil。这会导致在尝试访问对象的属性时出现分段错误。
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How to create non-nil fruit here? return nil } type Apple struct { color string } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() // Panics because nil pointer access apple.color = "red" }
解决方案
要解决此问题,我们需要修改 Create 函数以返回类型的有效实例T. 有两种方法可以实现此目的:
方法 1(非指针类型)
如果自定义类型不是指针类型(如 Apple 结构体),您可以声明类型变量并返回其地址:
func (f FruitFactory[T]) Create() *T { var a T return &a }
方法2(指针类型)
如果自定义类型是指针类型(如*Apple),解决方案涉及更多。您可以利用类型推断的强大功能将工厂的类型约束为指针类型:
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type param will match pointer types and infer U type FruitFactory[T Ptr[U], U any] struct{} func (f FruitFactory[T,U]) Create() T { // Declare var of non-pointer type. This is not nil! var a U // Address it and convert to pointer type (still not nil) return T(&a) } type Apple struct { color string } func example() { // Instantiating with ptr type appleFactory := FruitFactory[*Apple, Apple]{} apple := appleFactory.Create() // All good apple.color = "red" fmt.Println(apple) // &{red} }
注意:对于方法 2,类型推断已在 Go 1.18 中禁用,因此您必须手动指定所有类型参数,例如:FruitFactory[*Apple, Apple]{}。
通过这些修改, Create 函数将返回类型 T(或 *T)的有效实例,允许您访问其属性而不会导致分段错误。
以上是如何在 Go 1.18 泛型中创建类型化值的非 Nil 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文解释了GO的软件包导入机制:命名imports(例如导入“ fmt”)和空白导入(例如导入_ fmt; fmt;)。 命名导入使包装内容可访问,而空白导入仅执行t

本文解释了Beego的NewFlash()函数,用于Web应用程序中的页间数据传输。 它专注于使用newflash()在控制器之间显示临时消息(成功,错误,警告),并利用会话机制。 Lima

本文详细介绍了MySQL查询结果的有效转换为GO结构切片。 它强调使用数据库/SQL的扫描方法来最佳性能,避免手动解析。 使用DB标签和Robus的结构现场映射的最佳实践

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

本文详细介绍了在GO中详细介绍有效的文件,将OS.WriteFile(适用于小文件)与OS.openfile和缓冲写入(最佳大型文件)进行比较。 它强调了使用延迟并检查特定错误的可靠错误处理。

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

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

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

Dreamweaver Mac版
视觉化网页开发工具

记事本++7.3.1
好用且免费的代码编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器