假设我有以下结构:
type MyGeneric[T string | int] struct {
}
我想在创建新的MyGeneric时检查用于示例化该结构的泛型是字符串还是整型。
myGenericString := MyGeneric[string]{}
myGenericString.canHandle("hello") -> should return true
myGenericString.canHandle(8) -> should return false
func (mG MyGeneric[T]) canHandle(value any) bool {
// how to get what T is the same type as value
}
3条答案
按热度按时间w6lpcovy1#
还没有实现,有一个open proposal,关于给
reflect.Type
添加必要的方法。从Go语言1.19开始,目前的解决方法是解析从
TypeOf
中得到的字符串,如下所示:如果目标只是获取类型参数的名称,那么这并不好,因为它依赖于类型的字符串表示。从好的方面来说,它不会强迫你考虑如果用接口示例化
T
会发生什么。如果您需要对
T
类型做进一步的计算,例如,将其与其他类型进行比较等,@SOFe的答案提供了一个不依赖于任意字符串表示的解决方案。但是,请注意使用接口示例化的
T
:另请参阅In Golang, how to compare interface as generics type to nil?tktrz96b2#
只需直接示例化
T
以获取其值。输出量:
如果您担心
T
分配了太多未使用的堆栈,请将其改为数组:nue99wik3#
另一个解决方案是在你的结构体中添加一个placeHolder字段,它可以用来通过类型开关获取它的类型,以避免反射: