为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中为内置类型创建别名的文字切片

如何在 Go 中为内置类型创建别名的文字切片

Go
PIPIONE 2021-06-08 17:15:34
  我有一些操作接口类型切片的 golang 代码(Comparable)。为了测试我的代码,我想创建一些假数据并对其进行操作。但是,我在以一种并非令人难以置信的乏味的方式执行此操作时遇到了麻烦。我唯一能想到的就是创建一个满足 Comparable 接口的用于测试的新类型(在本例中为 int 类型的别名),然后为我的测试提供该类型的文字切片。我设想它看起来像下面这样:type Comparable interface {    LT(Comparable) bool    AsFloat() float64} type testInt int func (self testInt) LT(other Comparable) bool {     return float64(self) < other.AsFloat() } func (self testInt) AsFloat() float64 {     return float64(self) } func TestAFunction(t *testing.T) {     FunctionToTest([]Comparable{7, 4, 2, 1})    ....}然而,在这个例子中,编译器会抱怨类型 int 不能用作 Comparable。我明白为什么会发生这种情况,但我不确定如何解决。首先,我不知道如何创建 testInt 类型的文字。其次,我必须编写大量这些函数。对我的目的来说,使用文字整数要方便得多。有没有办法使用内置类型的类型别名,以便编译器可以用最少的代码正确推断出正确的文字类型?此外,是否有更好的方法来完成我想要做的事情,即生成满足用于测试的接口的硬数据?
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

有多种方法可以实现这一点。正如您正确指出的那样,问题在于 Go 编译器无法自动转换int为Comparable(因为这样做需要找到所有可能的等效类型,并确定哪些等效类型满足Comparable接口,然后确定是否有多个。 ..你明白了)。因此,您必须执行以下两项操作之一:


写一个显式类型转换:


FunctionToTest([]Comparable{ testInt(7), testInt(4), testInt(2), testInt(1) })

但是,如果您需要大量文字,这可能会非常烦人。因此,您还可以:


编写一个函数来转换[]int为[]Comparable:


func intToComparable(i []int) []Comparable {

    c := make([]Comparable, len(i))

    for i, v := range i {

        c[i] = testInt(v)

    }

    return c

}

然后你只需要做:


FunctionToTest(intToComparable([]int{ 7, 4, 2, 1 }))


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信