在 Go 中使用反射来获取结构的名称

我玩弄了答案并尝试以相同的方式获取结构的名称:


package main


import (

        "fmt"

        "reflect"

)


type Ab struct {


}


func getType(myvar interface{}) string {

        return reflect.TypeOf(myvar).Name()

}


func main() {

        fmt.Println("Hello, playground")


        tst := "string"

        tst2 := 10

        tst3 := 1.2

        tst4 := new(Ab)


        fmt.Println(getType(tst))

        fmt.Println(getType(tst2))

        fmt.Println(getType(tst3))

        fmt.Println(getType(tst4))


}

去游乐场:http : //play.golang.org/p/tD8mygvETH


但输出是:


Hello, playground

string

int

float64



Program exited.

预期输出将是:


Hello, playground

string

int

float64

Ab


Program exited.

我试图通过阅读文档来弄清楚,但没有找到相关问题。所以,对于这个非常普遍的问题,抱歉,但是:


是什么原因,reflect.TypeOf().Name()不适用于(这个)结构?


慕妹3242003
浏览 208回答 3
3回答

Smart猫小萌

在您的示例中,您传递的是指针类型 ( *Ab)的值,而不是结构类型。坚持 Type.Name()如果它不是指针,Type.Name()将正确返回Ab。在指针的情况下,如果您仍然想要结构的名称,则可以使用Type.Elem()来获取元素的类型:func getType(myvar interface{}) string {    if t := reflect.TypeOf(myvar); t.Kind() == reflect.Ptr {        return "*" + t.Elem().Name()    } else {        return t.Name()    }}测试它:tst4 := Ab{}tst5 := new(Ab)fmt.Println(getType(tst4))fmt.Println(getType(tst5))输出(在Go Playground上尝试修改后的示例):Ab*Ab笔记:请注意,由于Type.Name()不解析指针,如果传递的值是指向指针的指针,则它将不起作用,例如**Ab,而 asType.String()自动解析指针,在这种情况下也将起作用。我们也可以轻松地让我们的getType()函数使用**Ab(或使用任何深度的指针):func getType(myvar interface{}) (res string) {    t := reflect.TypeOf(myvar)    for t.Kind() == reflect.Ptr {        t = t.Elem()        res += "*"    }    return res + t.Name()}用值调用它:tst4 := Ab{}tst5 := new(Ab)tst6 := &tst5 // type of **Abtst7 := &tst6 // type of ***Ab输出(在Go Playground上试试):Ab*Ab**Ab***Ab使用 Type.String()一个更简单更好的方法是使用它Type.String()代替Type.Name()which 自动处理指针并包括包名称。例如:func getType(myvar interface{}) string {    return reflect.TypeOf(myvar).String()}对于修改后的示例,它输出:stringintfloat64main.Ab*main.Ab在Go Playground上试试这个变体。

BIG阳

fmt 也有一个很酷的%T标签package mainimport (    "fmt"    "net/http")type Potato struct {}func main() {    fmt.Printf("I have a %T, an %T and a %T\n", Potato{}, http.StatusMultipleChoices, &http.Response{})}输出I have a main.Potato, an int and a *http.Response https://play.golang.org/p/6z7_0BSitm

冉冉说

问题是new返回指针,下面应该得到想要的结果。package mainimport (    "fmt"    "reflect")type Ab struct {}func getType(myvar interface{}) {    valueOf := reflect.ValueOf(myvar)    if valueOf.Type().Kind() == reflect.Ptr {        fmt.Println(reflect.Indirect(valueOf).Type().Name())    } else {        fmt.Println(valueOf.Type().Name())    }}func main() {    fmt.Println("Hello, playground")    tst := "string"    tst2 := 10    tst3 := 1.2    tst4 := new(Ab)    getType(tst)    getType(tst2)    getType(tst3)    getType(tst4)}输出是Hello, playgroundstringintfloat64Ab
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go