登录
首页 >  Golang >  Go问答

打印 Go 中的类型参数名字

来源:stackoverflow

时间:2024-02-09 18:45:21 285浏览 收藏

本篇文章向大家介绍《打印 Go 中的类型参数名字》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

如果我在 golang 中编写一个泛型函数,我可以像这样打印该函数的任一参数的类型,这提供了对类型参数的一些了解:

func foo[t any](a t, b t) string {
    return fmt.sprintf("%v and %v are of type %t", a, b, a)
}

但是,如果我修改函数以取切片:

func foo[T any](args ...T) string {
    return fmt.Sprintf("%+v are of type %T", args, args)
}

这不会打印我想要的内容,因为调用 foo[int] 将意味着 args 具有 []int 类型,而我想打印 int。我可以修改它以打印 args[0] ,但这意味着我还必须检查 args 为空的情况,在这种情况下,我没有办法获取 args 的类型。我还可以使用反射来获取类型,但由于它是一个通用函数,我也应该在编译时知道这一点。

有没有一种方法可以在编译时获取 t 的名称,而无需打印任何参数的类型或通过反射?


正确答案


不可能在编译时打印类型名称。 fmtreflect 函数(fmt 使用)都是运行时操作。您也许能够通过静态分析找出某些表达式的类型,但这又与运行时打印正交。

无论如何在运行时,如果类型参数列表捕获复合类型的基本类型,包括可变参数切片,您可以通过声明 a new variable of that type 来简单地打印它。习惯用法 *new(t ) 特别允许使用单行代码来完成此操作:

func foo[t any](args ...t) string {
    return fmt.sprintf("%+v are of type %t", args, *new(t))
}

将其称为 foo(1,2,3) 现在会给出字符串:

"[1 2 3] are of type int"

是的,编译器足够聪明,知道 *new(t) 不会转义到堆。

没有

你需要对此进行反思。

好了,本文到此结束,带大家了解了《打印 Go 中的类型参数名字》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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