从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
?有什么优点和缺点?
答案 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/sort/#Float64Slice