草庐IT

reflection - 如何使用反射提取接口(interface)类型名称和包?

我需要使用反射知道类型名称及其路径。typeType有一个Name()和PkgPath()方法,但如果类型是一个接口(interface),它们都返回空。但是,如果我反射(reflect)一个函数并提取其参数的类型信息,我将获得正确的类型信息。我应该假设这是前一种情况下的错误吗?TypeOf不应该不管上下文(例如类型函数参数或值的类型)都返回相同的类型信息吗?我知道类型断言,但我并不总是有一个值来进行断言,所以我需要使用reflect.Type信息。packagemainimport("fmt""reflect""golang.org/x/net/context")funcmain()

reflection - 如何使用反射提取接口(interface)类型名称和包?

我需要使用反射知道类型名称及其路径。typeType有一个Name()和PkgPath()方法,但如果类型是一个接口(interface),它们都返回空。但是,如果我反射(reflect)一个函数并提取其参数的类型信息,我将获得正确的类型信息。我应该假设这是前一种情况下的错误吗?TypeOf不应该不管上下文(例如类型函数参数或值的类型)都返回相同的类型信息吗?我知道类型断言,但我并不总是有一个值来进行断言,所以我需要使用reflect.Type信息。packagemainimport("fmt""reflect""golang.org/x/net/context")funcmain()

go - Go中对象的大小

只是想构建一个基于LRU的缓存机制,它是内存消耗感知的,因为经过一番搜索后我找不到现成的缓存机制。缓存项是原生Go对象,可以是基本类型、结构、slice、数组或任何有效组合,但没有递归引用,我们可以为池分配内存使用上限,一旦总内存消耗达到阈值,将触发基于最近最近使用的清理。我知道准确的内存大小计算是不切实际的,但我认为粗略的估计在这里可能会有很大帮助。至少它比项目编号更好,就像在GroupCache中所做的那样忽略缓存对象的大小。那么计算/估计给定值使用的字节数的正确方法是什么? 最佳答案 我很久以前写过这个函数,它是递归的并且没有

go - Go中对象的大小

只是想构建一个基于LRU的缓存机制,它是内存消耗感知的,因为经过一番搜索后我找不到现成的缓存机制。缓存项是原生Go对象,可以是基本类型、结构、slice、数组或任何有效组合,但没有递归引用,我们可以为池分配内存使用上限,一旦总内存消耗达到阈值,将触发基于最近最近使用的清理。我知道准确的内存大小计算是不切实际的,但我认为粗略的估计在这里可能会有很大帮助。至少它比项目编号更好,就像在GroupCache中所做的那样忽略缓存对象的大小。那么计算/估计给定值使用的字节数的正确方法是什么? 最佳答案 我很久以前写过这个函数,它是递归的并且没有

go - 检查结构字段是否为空

我想在将JSON对象解码到其中后遍历struct的字段,并检查未设置值的字段(即为空)。我可以获得每个字段的值并将其与相应类型的reflect.Zero值进行比较json.Unmarshal([]byte(str),&res)s:=reflect.ValueOf(&res).Elem()typeOfT:=s.Type()fori:=0;i但问题当然是,这对于bool或int值来说效果不佳。如果bool字段在JSON中设置为false或者int字段设置为0,它们将等于它们类型的零值。上述检查会将字段视为未初始化,即使它们实际上已设置值。我知道解决这个问题的一种方法是使用指针,但我只是不知

go - 检查结构字段是否为空

我想在将JSON对象解码到其中后遍历struct的字段,并检查未设置值的字段(即为空)。我可以获得每个字段的值并将其与相应类型的reflect.Zero值进行比较json.Unmarshal([]byte(str),&res)s:=reflect.ValueOf(&res).Elem()typeOfT:=s.Type()fori:=0;i但问题当然是,这对于bool或int值来说效果不佳。如果bool字段在JSON中设置为false或者int字段设置为0,它们将等于它们类型的零值。上述检查会将字段视为未初始化,即使它们实际上已设置值。我知道解决这个问题的一种方法是使用指针,但我只是不知

reflection - 获取 Go 结构中字段的 reflect.Ptr 类型

我正在尝试向第三方包传递指向结构中字段的可变指针列表。该包接受一个可变的interface{}列表(funcPersist(...interface)error),其中每个接口(interface)值都是一个指向变量的指针。我创建了一个函数来模拟第三方库并打印出指针的类型和种类(下面称为mockFunction)。当我以非可变方式将结构变量的地址传递给它时,它们在使用反射调用的模拟函数中具有它们的原始类型和值。但是,当我使用扩展以可变方式传递它们时,它们具有Type:Type:reflect.Value和Kind:struct。第三方包不知道如何处理这种形式。我想找出一种方法来调用带有

reflection - 获取 Go 结构中字段的 reflect.Ptr 类型

我正在尝试向第三方包传递指向结构中字段的可变指针列表。该包接受一个可变的interface{}列表(funcPersist(...interface)error),其中每个接口(interface)值都是一个指向变量的指针。我创建了一个函数来模拟第三方库并打印出指针的类型和种类(下面称为mockFunction)。当我以非可变方式将结构变量的地址传递给它时,它们在使用反射调用的模拟函数中具有它们的原始类型和值。但是,当我使用扩展以可变方式传递它们时,它们具有Type:Type:reflect.Value和Kind:struct。第三方包不知道如何处理这种形式。我想找出一种方法来调用带有

go - 使用 reflect.DeepEqual 时查找哪个结构字段不相等

在使用reflect.DeepEqual()比较两个结构时,如何找到不同的结构字段。当我打印结构值时,我看不到这两个结构值之间有任何区别,但reflect.DeepEqual()方法仍然返回false 最佳答案 正如kostix在他(现已删除)的回答中指出的那样https://github.com/go-test/deep非常有用。在比较基于XML/JSON文档的大型结构时,它帮助我在几分钟内找到问题。diff:=deep.Equal(got,want)ifdiff!=nil{t.Errorf("comparefailed:%v",

go - 使用 reflect.DeepEqual 时查找哪个结构字段不相等

在使用reflect.DeepEqual()比较两个结构时,如何找到不同的结构字段。当我打印结构值时,我看不到这两个结构值之间有任何区别,但reflect.DeepEqual()方法仍然返回false 最佳答案 正如kostix在他(现已删除)的回答中指出的那样https://github.com/go-test/deep非常有用。在比较基于XML/JSON文档的大型结构时,它帮助我在几分钟内找到问题。diff:=deep.Equal(got,want)ifdiff!=nil{t.Errorf("comparefailed:%v",