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

时间:2015-07-17 10:11:31

标签: go conventions convention

从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?有什么优点和缺点?

2 个答案:

答案 0 :(得分:10)

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

此外,在您的示例中,不需要取Trips的地址,因为slice已经是一种“胖指针”。所以你可以简化你的方法:

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

答案 1 :(得分:7)

如果这是你的类型(切片),它就好了。它使您可以轻松访问底层元素(并允许range迭代),同时提供其他方法。

当然,您可能只应该在此类型上保留必要的方法集,而不是使用[]Trip作为参数的所有内容。 (例如,我建议使用DrawTripsOnTheGlobe(t Trips),而不是将其作为Trips&#39;方法。)

为了让你平静下来,标准套装中有很多这样的切片类型:

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