2015-07-17 18 views
8

Ý tưởng hay là tạo loại riêng từ một lát ở Golang?Quy ước GoLang - tạo loại tùy chỉnh từ slice

Ví dụ:

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 
} 

Có bằng cách nào đó một quy ước trong Golang để tạo ra các loại như Trips trong ví dụ của tôi? Hoặc tốt hơn là sử dụng []Trip trong toàn bộ dự án? Bất kỳ ưu và nhược điểm nào?

+0

Có, nếu bạn sẽ hiểu rằng những chuyến đi như vậy. Các chuyên gia khuyên bạn nên đặt tên các loại trong bối cảnh của vấn đề đang được giải quyết. –

Trả lời

6

Không có quy ước nào, theo như tôi biết. Bạn có thể tạo một loại slice nếu bạn thực sự cần nó. Trên thực tế, nếu bạn muốn sắp xếp dữ liệu của mình, đây là cách duy nhất: tạo một loại và xác định phương thức sort.Interface trên đó.

Ngoài ra, trong ví dụ của bạn, không cần phải lấy địa chỉ của Trips vì lát cắt đã là "con trỏ chất béo" của một loại. Vì vậy, bạn có thể đơn giản hóa phương pháp của mình thành:

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

Nếu đây là loại của bạn (một lát), thì tốt thôi. Nó cho phép bạn truy cập dễ dàng vào các phần tử cơ bản (và cho phép lặp lại range) trong khi cung cấp các phương thức bổ sung.

Tất nhiên, bạn có lẽ chỉ nên giữ thiết yếu đặt các phương pháp thuộc loại này và không làm đầy nó bằng mọi thứ sẽ mất []Trip làm đối số. (Ví dụ: Tôi sẽ đề nghị có DrawTripsOnTheGlobe(t Trips) thay vì phải nó như là phương pháp một Chuyến đi.)

Để làm dịu tâm trí của bạn có rất nhiều ví dụ lát-loại trong gói tiêu chuẩn:

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

Các vấn đề liên quan