2015-01-08 15 views
12

Tôi đang chơi với Go nhưng tôi đang gặp khó khăn khi làm những việc rất đơn giản bằng các ngôn ngữ khác.Golang tương đương với việc hiểu danh sách của Python

Tôi muốn để tái tạo một cú pháp tương tự:

array = [a for a in anotherArray if (some condition)] 

một cách thanh lịch để làm điều đó trong Go là gì? Tôi thực sự muốn đơn giản hóa mã của tôi đặc biệt là khi sử dụng chức năng trên mảng. Ví dụ:

min = min(abs(a[i], b[j]) for i in range(n) 
          for j in range(i, n)) 

Rất cám ơn

+3

Tôi nghĩ thuật ngữ bạn đang tìm kiếm là danh sách python 'comprehension' –

+3

Chỉ cần viết vòng lặp cho mình. Lập trình không bị tổn thương. – Volker

+0

@Volker lý do tại sao các downvote? Bạn không tìm thấy [Tóm tắt các thảo luận về Generics Generics] (https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/mobilebasic?pli=1) có thú vị không? Tài liệu đó bao gồm các đề xuất tương tự như nhận xét của bạn. – VonC

Trả lời

6

Điều thú vị đủ, Rob Pike chỉ đề xuất (18 giờ trước) thư viện filter mà không một chút những gì bạn muốn:

Xem for instance Choose()

// Choose takes a slice of type []T and a function of type func(T) bool. (If 
// the input conditions are not satisfied, Choose panics.) It returns a newly 
// allocated slice containing only those elements of the input slice that 
// satisfy the function. 

Tested here:

func TestChoose(t *testing.T) { 
    a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} 
    expect := []int{2, 4, 6, 8} 
    result := Choose(a, isEven) 

Như twotwotwo points out in the comments, các GoDoc for this library trạng thái:

Gói filter chứa các chức năng tiện ích để lọc lát thông qua ứng dụng phân phối của một hàm lọc.

Gói là một thử nghiệm để xem việc viết những thứ đó như thế nào trong Go dễ dàng như thế nào. Thật dễ dàng, nhưng for vòng lặp đơn giản và hiệu quả hơn.

Bạn không nên sử dụng gói này.

caveat này được phản ánh trong tài liệu "Summary of Go Generics Discussions", phần "Functional Code":

Đây là những thông thường higher-order functions như map, reduce (fold), filter, zip, vv

Trường hợp:
biến đổi dữ liệu an toàn ns: map, fold, zip

Ưu điểm khi sử dụng Generics:
cách ngắn gọn để diễn tả sự biến đổi dữ liệu.

Nhược điểm cho việc sử dụng Generics:
Giải pháp nhanh nhất cần phải đưa vào tài khoản khi nào và ở đó để áp dụng những biến đổi, và bao nhiêu dữ liệu được tạo ra ở mỗi bước.
Khó đọc hơn đối với người mới bắt đầu.

giải pháp thay thế:

sử dụng for vòng và ngôn ngữ thông thường xây dựng.

+1

Tôi có xu hướng đồng ý với readme của Pike - sử dụng 'for'. Có thể mãi mãi nhưng chắc chắn cho đến bây giờ, Go là một ngôn ngữ bắt buộc ủng hộ mã thẳng. Ngôn ngữ có lẽ sẽ không thay đổi để làm cho các cách tiếp cận khác dễ dàng hơn, nhiều hơn hoặc ít hơn bất kể có bao nhiêu người muốn. Điểm của gói là (sau khi nhận được khiếu nại) rằng bạn có thể làm điều đó nếu bạn cảm thấy bạn thực sự * cần * nó với 'phản ánh' và các công cụ, không phải là anh nghĩ bạn nên. – twotwotwo

+0

@twotwotwo có, tôi giả sử ''for'', cộng với một số '' đi tạo' 'là đủ. – VonC

+6

Lưu ý phần nổi bật "Bạn không nên sử dụng gói này". tại http://godoc.org/robpike.io/filter – twotwotwo

1

Nếu những gì bạn đang tìm kiếm thực sự là danh sách python hiểu, không có cú pháp tương đương như vậy trong AFAIK đi.

Cách để làm điều đó là tạo một hàm lấy một lát và một hàm (để kiểm tra điều kiện) và trả về một lát mới.

EDIT: Có vẻ như đã có một tính năng như vậy trong Go. cf VonC

+0

Không có trong Go (chỉ là một thư viện thông thường trên GitHub) và tài liệu này khuyên bạn không nên sử dụng nó; nó chỉ là một thử nghiệm để cho thấy bạn có thể làm điều đó nếu bạn muốn. – twotwotwo

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