Соглашения GoLang — создание пользовательского типа из фрагмента

Стоит ли создавать собственный тип из слайса в 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 во всем проекте? Есть плюсы и минусы?


person DHlavaty    schedule 17.07.2015    source источник
comment
Да, если вы поймете, что такое Поездки. Специалисты рекомендуют называть типы в контексте решаемой задачи.   -  person    schedule 17.07.2015


Ответы (2)


Там нет никакого соглашения, насколько я знаю. Можно создать тип среза, если он вам действительно нужен. На самом деле, если вы когда-нибудь захотите отсортировать данные, это практически единственный способ: создать тип и определить sort.Interface на нем.

Кроме того, в вашем примере нет необходимости брать адрес Trips, поскольку срез уже является своего рода «толстым указателем». Таким образом, вы можете упростить свой метод:

func (trips Trips) TotalLength() (tl int) {
    for _, l := range trips {
        tl += l.Length
    }
    return tl
}
person Ainar-G    schedule 17.07.2015
comment
В этом случае мы могли бы просто написать этот метод в одной строке как func (trips Trips) TotalLenght() int {return len(trips)} - person Eden Trainor; 13.04.2020

Если это ваш тип (кусочек), то все в порядке. Это дает вам легкий доступ к базовым элементам (и позволяет выполнять 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

person tomasz    schedule 17.07.2015