登录
首页 >  Golang >  Go问答

不使用reflrect打印类型并创建新对象

来源:stackoverflow

时间:2024-04-15 10:24:33 309浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《不使用reflrect打印类型并创建新对象》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

在下面的代码中,为了显示预期的类型,我必须创建一个新对象并在其上调用 reflect.typeof

package main

import (
    "fmt"
    "reflect"
)

type X struct {
    name string
}

func check(something interface{}) {
    if _, ok := something.(*X); !ok {
        fmt.Printf("Expecting type %v, got %v\n", 
            reflect.TypeOf(X{}), reflect.TypeOf(something))
    }
}

func main() 
    check(struct{}{})
}

也许对象创建不是开销,但我仍然想知道更好的方法。 java中有类似x.getname()x.getsimplename()之类的东西吗?


解决方案


要获取类型的 reflect.Type 描述符,您可以使用

reflect.typeof((*x)(nil)).elem()

以避免必须创建 x 类型的值。请参阅以下问题了解更多详细信息:

How to get the string representation of a type?

Golang TypeOf without an instance and passing result to a func

要打印某个值的类型,您可以使用 fmt.printf("%t, something)

实际上,对于你想做的事情,你可以完全把反思放在一边,只需这样做:

fmt.printf("expecting type %t, got %t\n", (*x)(nil), something)

输出将是(在 Go Playground 上尝试):

expecting type *main.x, got struct {}

使用反射几乎总是一个糟糕的选择。您可以考虑使用以下方式之一

使用开关

如果您想根据类型控制流量,可以使用 switch 结构

func do(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.printf("twice %v is %v\n", v, v*2)
    case string:
        fmt.printf("%q is %v bytes long\n", v, len(v))
    default:
        fmt.printf("i don't know about type %t!\n", v)
    }
}

使用fmt

如果您只想显示其类型,您可以随时使用 fmt

i := 1000
fmt.Printf("The type is %T", i)

好了,本文到此结束,带大家了解了《不使用reflrect打印类型并创建新对象》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>