pointers - 为什么在 Go 中将指针放在 interface{} 中会导致 reflect 丢失类型名称?

标签 pointers reflection go

下面的示例显示了当您反射(reflection)设置为对象 (g) 和指向所述对象 (h) 的指针的接口(interface) {} 时会发生什么。这是设计使然,当我将指针放入接口(interface) {} 时,我是否应该期望我的数据类型丢失或者更确切地说我无法取回数据类型的名称?

package main

import "fmt"
import "reflect"

type Foo struct {
    Bar string
}

func main() {
    f := Foo{Bar: "FooBar"}
    typeName := reflect.TypeOf(f).Name()
    fmt.Printf("typeName %v\n", typeName)

    var g interface{}
    g = f
    typeName = reflect.TypeOf(g).Name()
    fmt.Printf("typeName %v\n", typeName)

    var h interface{}
    h = &f
    typeName = reflect.TypeOf(h).Name()
    fmt.Printf("typeName %v\n", typeName)
}

输出:

typeName Foo
typeName Foo
typeName 

同时在:

http://play.golang.org/p/2QuBoDxHfX

最佳答案

正如 Name 方法的文档所说,未命名的类型将返回一个空字符串:

Name returns the type's name within its package. It returns an empty string for unnamed types.

h 的类型是未命名的指针类型,其元素类型是已命名的结构类型 Foo:

v := reflect.TypeOf(h)
fmt.Println(v.Elem().Name()) // prints "Foo"

如果您想要像这样的复杂未命名类型的标识符,请使用 String 方法:

fmt.Println(v.String()) // prints "*main.Foo"

关于pointers - 为什么在 Go 中将指针放在 interface{} 中会导致 reflect 丢失类型名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28338600/

相关文章:

java - 使用 Java Reflection 获取运行时上下文中所有定义的变量(内部有 voodoo)

go - 如何在不尝试更新其他模块的情况下将 'go get' 或 'go mod vendor' 用于特定模块?

go - 使用标准库的函数处理程序 GoLang

java - 在运行时获取属性类型

parsing - 如何解析任意长度的文件?

c - 为什么 main 函数和 func 函数的 char 指针 p 的输出不同?

c - 为什么只有算术运算打印出一个值而不是一个正常的值

c - 使用指向指针的指针初始化矩阵?

c - 表达式必须是可修改的左值(指向结构的指针)

java - Java 中的动态类加载(枚举)