【问题标题】:GoLang conventions - create custom type from sliceGoLang 约定 - 从切片创建自定义类型
【发布时间】:2015-07-17 10:11:31
【问题描述】:

在 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
}

在我的示例中创建像 Trips 这样的类型是 Golang 中的某种约定吗?还是在整个项目中使用[]Trip比较好?有什么优缺点吗?

【问题讨论】:

  • 是的,如果您能理解这样的旅行。专家建议根据正在解决的问题来命名类型。

标签: go conventions convention


【解决方案1】:

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

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

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

【讨论】:

  • 在这种情况下,我们可以在一行中将该方法写成func (trips Trips) TotalLenght() int {return len(trips)}
【解决方案2】:

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

当然,您可能应该只在这种类型上保留 essential 组方法,而不是用所有将[]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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2015-05-15
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2016-12-13
    相关资源
    最近更新 更多