当前位置: 首页 > 面试题库 >

在没有泛型的情况下编写泛型函数

朱明知
2023-03-14
问题内容

我知道Go将来不会有泛型,并且有一些建议可以用其他结构代替它们。但是在下面的例子中,我陷入了困境。

func P(any interface{}, err error) (interface{}) {
    if err != nil {
        panic("error: "+ err.Error())
    }
    return any
}

您可能会猜到,我试图使任何错误均告失败,并且希望将P()任何返回两个结果的函数放到第二个错误中。这工作正常,但any丢失了它的类型信息,并且结果中只是一个空接口。

由于我也正在调用lib函数,因此我看不到使用Interfaces或Reflection解决此问题的方法。

有任何想法吗?我是完全走错了道路还是接近目标?


问题答案:

一种解决方案是针对go generate您的P()html" target="_blank">功能,针对您需要使用的每种具体类型提供一种解决方案。
请参阅以下示例:

  • “ 使用“ go generate” 在Go中进行通用编程。
  • “ joeshaw / gengen ”
  • “ 厚脸皮/怪癖 ”
  • “ Clipperhouse / gen ”
  • “ 在Go中实现类型泛型函数,而无需使用反射 ”

这将使调用这些lib函数更加容易,因为生成的具体P()实现将使用正确的类型而不是interface {}。



 类似资料:
  • 我用以下代码提炼出了问题的本质: 完整来源 我有基类和Derive, Derived2: 现在我有了变量t,它可以是派生的或派生的2的实例。它也可以在运行时多次更改。 我有一个函数,它检查t是否是传递类的实例,如果它是传递类的实例或未定义的实例,则返回t。 当我调用Check Top(Derive)时,它的返回类型应该是Derive。但是在上面的jsdoc中,它的返回类型是“typeof Deri

  • 问题内容: 在C#中,我实际上可以这样做: 但是由于某种原因,我无法使其在Java中工作。 我要做的是在超类上创建一个静态方法,以便可以将子类转换为XML。 问题答案: 称为: 或更明确地: 更令人困惑的是,您可以拥有既构造泛型类型又具有泛型参数的构造函数。不记得该语法,也从未在愤怒中使用过它(无论如何,最好还是使用静态创建方法)。 强制转换是不安全的,并且您不能编写T.class。因此,将T.c

  • 将本身赋值给似乎并不让编译器担心,而且如果的参数是而不是时,也不会出现问题。 不幸的是,似乎没有一种方法来命名参数类型,这样我就可以再次将其用作的类型和/或用一个老式的内部类替换lambda。 例如,这在语法上甚至是不允许的: 编译器接受这一点,但出于让类型检查器高兴的原因而进行的间接调用并不是我所说的真正优雅的调用。

  • 同样的规则也可以适用于函数:在使用前给出 <T> 后,类型 T 就变成了泛型。 使用泛型函数有时需要显式地指明类型参量。这种可能的情况包括,调用返回类型是泛型的函数,或者编译器没有足够的信息来推导类型参量。 函数调用使用显式指定的类型参量,如下所示: fun::<A, B, ...>(). struct A; // 具体类型 `A`。 struct S(A); //

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或