GoLang规范 - 从切片创建自定义类型

14

从 Golang 的一个切片创建自己的类型是一个好主意吗?

示例:

type Trip struct {
    From   string
    To     string
    Length int
}

type Trips []Trip // <-- is this a good idea?

func (trips *Trips) TotalLength() int {
    ret := 0
    for _, i := range *trips {
        ret += i.Length
    }

    return ret
}

在Golang中像我例子中创建类型Trips是一种惯例吗?还是在整个项目中使用[]Trip更好?有什么利弊?


是的,如果您能理解这样的旅行。专家建议在解决问题的上下文中命名类型。 - user4651282
2个回答

17

据我所知,目前没有任何公约。如果您确实需要它,则可以创建切片类型。实际上,如果您想要对数据进行排序,这几乎是唯一的方法:创建一个类型并在其上定义sort.Interface方法。

此外,在您的示例中,没有必要获取Trips的地址,因为切片已经是一种"fat pointer"。因此,您可以将方法简化为:

func (trips Trips) TotalLength() (tl int) {
    for _, l := range trips {
        tl += l.Length
    }
    return tl
}

1
在这种情况下,我们可以将该方法写成一行代码,如 func (trips Trips) TotalLenght() int {return len(trips)} - Eden Trainor

8
如果您的类型是切片,那就很好。它可以让您轻松访问底层元素(并允许进行range迭代),同时提供了其他方法。
当然,您可能只应该在此类型上保留基本的方法,而不要用需要[]Trip作为参数的所有内容来膨胀它。(例如,我建议使用DrawTripsOnTheGlobe(t Trips)而不是将其作为Trips的方法。)
为了安抚您的心灵,在标准包中有许多这样的切片类型:

http://golang.org/pkg/net/#IP

http://golang.org/pkg/sort/#Float64Slice

http://golang.org/pkg/sort/#IntSlice

http://golang.org/pkg/encoding/json/#RawMessage


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接