首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Go中为内置类型创建别名的文字切片

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

Stack Overflow用户
提问于 2013-08-06 07:47:46
回答 3查看 1K关注 0票数 0

我有一些golang代码来操作接口类型的切片(可比较的)。为了测试我的代码,我想要创建一些假数据并对其进行操作。然而,我在这样做时遇到了困难,因为这样做并不令人难以置信的乏味。我想要做的唯一一件事是创建一个新类型,用于测试(在本例中是int类型的别名),它满足可比较的接口,然后为我的测试提供该类型的文本切片。我设想它看起来如下所示:

代码语言:javascript
运行
复制
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类型不能用作可比类型。我明白为什么会发生这种事,但我不知道如何解决。首先,我不知道如何创建testInt类型的文字。第二,我必须编写大量这些函数。就我的目的而言,使用文字ints要方便得多。

是否有一种方法可以使用内置类型的类型别名,以便编译器能够用最少的代码正确地推断出正确的文字类型?

此外,是否有更好的方法来完成我正在尝试的工作,即生成满足测试中使用的接口的硬数据?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-06 14:44:28

要做到这一点,有许多方法。正如您正确地指出的,问题是Go编译器不能自动将int转换为Comparable (因为这样做需要查找所有可能的等效类型,并确定哪些等效类型满足Comparable接口,然后如果有多个.你明白的)。因此,您必须做两件事中的一件:

编写显式类型转换:

代码语言:javascript
运行
复制
FunctionToTest([]Comparable{ testInt(7), testInt(4), testInt(2), testInt(1) })

然而,如果您需要大量的文字,这可能会变得非常烦人。因此,您还可以:

编写一个将[]int转换为[]Comparable的函数

代码语言:javascript
运行
复制
func intToComparable(i []int) []Comparable {
    c := make([]Comparable, len(i))
    for i, v := range i {
        c[i] = testInt(v)
    }
    return c
}

然后你只需要做:

代码语言:javascript
运行
复制
FunctionToTest(intToComparable([]int{ 7, 4, 2, 1 }))
票数 2
EN

Stack Overflow用户

发布于 2013-08-06 08:15:20

代码语言:javascript
运行
复制
func NewWhatevers(a ...int) (r []Whatever) {
        r = make([]Whatever, len(a))
        for i, v := range a {
                r[i] = Whatever(v)
        }
        return
}

...

myWhatevers := NewWhatevers(7, 4, 2, 1)
票数 4
EN

Stack Overflow用户

发布于 2013-08-06 08:56:00

此外,是否有更好的方法来完成我正在尝试的工作,即生成满足测试中使用的接口的硬数据?

也许吧。您遇到的问题是,[]Comparable[]testInt是根本不同的,不能交换,因为内存中的底层表示是不同的。如果您的代码不是关于单个项目(即Comparable ),而是更多关于可以比较的项片,那么您可以重构您的代码来处理整个切片。

看看package sort是如何做到这一点的:它不是在一个可比较的部分上操作,而是在一个“可比较的部分”上操作。

代码语言:javascript
运行
复制
// FloatOrder is a slice with comparable and float-convertible elements 
type FloatOrder interface {
    Less(i, j int) bool  // Compare element i and j and return true first is less than the other
    Float(i int) float64 // Return element i as a float64
}

type testInts []int
func (n testInts) Less(i, j int) bool {return n[i] < n[j]}
func (n testInts) Float(i int) float64 { return float64(n[i]) }

func FunctionTotest(fo FloatOrder) { ... }

func TestAFunction(t *testing.T) { 
       FunctionToTest(testInts{1,2,3,4})
       ....
}

(完全未经测试的纯插图代码)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18074464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档