如何在interface{}上使用reflect.NewAt?
php小编新一为您介绍如何在interface{}上使用reflect.NewAt。reflect.NewAt是Go语言中的反射库函数,用于在给定的接口类型上创建新的实例。通过使用reflect.NewAt,我们可以动态地创建并初始化一个新的接口实例,而不需要在编译时指定具体的类型。这为我们提供了更大的灵活性和动态性,使得代码可以更加通用和可扩展。下面将为您详细解答如何使用reflect.NewAt在interface{}上创建实例。
问题内容
package main import ( "encoding/json" "fmt" "reflect" "unsafe" ) type Stu struct { Name string `json:"name"` } func MakeStu() interface{} { return Stu{ Name: "Test", } } func main() { jsonData := []byte(`{"name":"New"}`) t1 := MakeStu() t2 := MakeStu() t3 := MakeStu() json.Unmarshal(jsonData, &t1) fmt.Println(t1) //Type of t1 becomes map[string]interface{} instead of struct Stu newPointer := reflect.New(reflect.ValueOf(t2).Type()).Interface() json.Unmarshal(jsonData, newPointer) fmt.Println(newPointer) //It works,but it need allocate memory to hold temp new variable brokenPointer := reflect.NewAt(reflect.ValueOf(t3).Type(), unsafe.Pointer(&t3)).Interface() json.Unmarshal(jsonData, brokenPointer) fmt.Println(brokenPointer) // I want to get the pointer of original type based on the existed variable t3,but it crashes. }
如果我在编码时不知道interface{}的具体类型,就无法使用interface.(type)进行强制转换。 那么如何在interface{}上使用reflect.newat呢?
如果有一个接口,其中包含一个返回interface{}的方法,其具体类型是struct,但我在编码时无法确定struct的类型。我需要使用 json.unmarshal 来解码由 json 编码的数据。我不想获得 map[string]interface{} ,所以我需要将接收者的类型设置为 interface{} 的具体类型的指针。使用reflect.new 很简单,但会消耗额外的内存,因此我很好奇如何将reflect.newat 与现有接口一起使用{}。
解决方法
我想花几句话解释一下问题所在。
我们无法控制的函数 makestu()
返回空接口 - 不是具体类型。这将使具体类型对 json.unmarshal()
“不可见”,并且 json.unmarshal()
将其视为空接口,而不是具体类型 stu
。我们必须以某种方式将具体类型传达给解组器。
我会用类型开关解决这个问题:
func main() { jsondata := []byte(`{"name":"new"}`) t1 := makestu() switch c := t1.(type) { default: _ = json.unmarshal(jsondata, &c) t1 = c } fmt.println(t1) }
类型开关将空接口转换为具体类型,并且 json.unmarshal()
会将其视为具体类型。您可能仍然会有额外的分配,但代码更具可读性,并且您不依赖于反射。
如果我真的很喜欢冒险,我会添加一个辅助函数,接受指向空接口的指针,如下所示:
func unmarshal(data []byte, i *interface{}) (err error) { switch c := (*i).(type) { default: err = json.unmarshal(data, &c) *i = c } return err }
这将启用这样的用法:
jsonData := []byte(`{"name":"New"}`) t1 := MakeStu() unmarshal(jsonData, &t1)
这对我来说看起来很干净,并且不涉及反射,但它没有像您自己建议的那样使用 reflect.newat()
。我希望您发现我的建议仍然有用。
以上是如何在interface{}上使用reflect.NewAt?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

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

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Go语言中哪些库是大公司开发或知名开源项目?在使用Go语言进行编程时,开发者常常会遇到一些常见的需求,�...

关于Goland中自定义结构体标签的问题在使用Goland进行Go语言开发时,经常会遇到一些配置上的问题。其中一个常�...

Go语言中实现高效键值对存储的正确方法在使用Go语言开发类似于Redis的键值对内存存储器时,如何实现最佳性能...

Go指针语法及viper库使用中的寻址问题在使用Go语言进行编程时,理解指针的语法和使用方法至关重要,尤其是在...

Go语言海量URL访问性能优化策略本文针对使用Go语言处理海量URL访问的问题,提出性能优化方案。现有程序从CSV�...
