当前位置: 首页 > 知识库问答 >
问题:

为什么在Go中的接口{}中放置指针会导致reflect丢失类型的名称?

颛孙嘉玉
2023-03-14

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

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

共有1个答案

吕永寿
2023-03-14

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

Name在其包中返回类型的名称。它为未命名的类型返回一个空字符串。

<code>h</code>的类型是一个未命名的指针类型,其元素类型是命名的结构类型<code>Foo</code>:

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

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

fmt.Println(v.String()) // prints "*main.Foo"
 类似资料:
  • 问题内容: 例如下面的示例: DO 和两个满足,即使一个是一个指针,另一个是直接一个结构? 问题答案: 通过编译代码很容易得到答案: 该错误是基于以下规格要求: 接收器类型必须采用T或 T的形式,其中T是类型名称。用T表示的类型称为接收方基本类型; 它不能是指针或接口类型* ,并且必须在与方法相同的包中声明。 (强调我的) 声明: 声明一个 指针 类型,即 没有资格作为方法接收者。

  • 问题内容: 解释我的问题的最短方法是该代码: 但是,如果我尝试将指向Item的指针设置为i,代码将起作用: 但是我的函数接收对象,而不是指向它的指针。我可以得到它的类型(第一)。但是当我尝试指向它的指针时,我收到的是,而不是我的Object()的指针。 我可以指向该对象进行调用吗?或者可能是其他方式 问题答案: 切勿使用指向接口的指针。如果您需要一个指针来使用指针接收器调用方法,则必须将指针放入。

  • 使用Flume源syslogudp,我看到大约25%的数据丢失。 这是我的配置 a1.sources = r1 a1.sinks=k1 a1 .通道= c1 a1.sources.r1.type = syslogudp a1.sources.r1.bind = 172.24.1.78 a1.sources.r1.port = 65535 a1.sinks.k1.type=文件滚动 水槽。水槽。目录

  • 我使用malloc来分配指针类型使用的内存。然后我强行修改指针类型。使用free func释放内存块。我很想知道内存泄漏是否会发生?

  • 问题内容: 创建接口方法时,我们不能像在 java中 那样做: 相反,我注意到我们还需要给参数名称lile: 同样,接口实现者不需要具有与接口方法中相同的参数名称。 我在这里发现了有关c#的类似问题。他们提到了 命名参数的一种情况,但是我没有在Java中找到任何其他相关原因。 问题答案: 从技术角度来看,这是没有必要的。 我一直将其作为语法规范化和文档帮助。 这样有: 没有理由区分类和接口方法的语

  • 本文向大家介绍什么是指针的释放? 相关面试题,主要包含被问及什么是指针的释放? 时的应答技巧和注意事项,需要的朋友参考一下 具体来说包括两个概念. 1 释放该指针指向的内存,只有堆上的内存才需要我们手工释放,栈上不需要. 2 将该指针重定向为NULL.