gpt4 book ai didi

go - Go中的打印类型参数名称

转载 作者:行者123 更新时间:2023-12-05 09:01:52 25 4
gpt4 key购买 nike

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

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

但是,如果我修改函数以取一个 slice :

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 使用)都是运行时操作。您可能能够通过静态分析找出某些表达式的类型,但这同样与运行时打印正交。

无论如何在运行时,如果类型参数列表捕获复合类型的基类型,包括可变参数 slice ,您可以通过声明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 - Go中的打印类型参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72610728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com