2012-12-06 18 views

回答

3

後面的情況是必須要做的。至於Go沒有泛型,它是目前唯一可用的選項。

+1

我記得Go發佈時有一定程度的分歧,語言bultins是通用的,但是沒有辦法寫自己的。 C++程序員期待地球;-) –

0

在標準庫的container/vector模塊中使用矢量類型來實現這些方法,基於可調整大小的切片,並且完美地作爲容器與heap模塊一起使用。不幸的是,他們擺脫了vector,這是我從來沒有理解的,因爲它通過切片變量實現了一個很好的方法級抽象。因此,現在,每當我看到有人在Go中使用堆模塊時,他們都必須基本重新實現部分vector - 根據切片變量編寫PushPop,Length等。

+2

然後'container.Vector'也被[SliceTricks](http://code.google.com/p/go-wiki/wiki/SliceTricks)的b/c所廢棄。另一個原因是'Vector'只支持3種類型('int','string','interface {}'),但引用的技巧可以用於任何類型的任何靜態類型安全的程序: – zzzz

+0

@jnml:您沒有閱讀我所說。 'heap'算法需要一個類型爲'Push','Pop','Len','Less'和'Swap'的方法。 'Vector'已經包含了所有這些。 SliceTricks沒有幫助。 – newacct

1

還沒有嘗試過,但也許你可以使用反射和結構標籤,如果你的情況發生適合某些限制。你會要求你的heapable類型是一個帶有標籤的結構,比如用於排序的字段上的`pq:「Key」`,並且該類型的字段類型爲<。它比Less方法強大得多,但它可能會滿足您的需求。

對不起,我沒有你的例子代碼。我認爲這不會很難,但這需要我一些時間。留下鍛鍊。

如果我有一種情況需要處理任意結構,並且我可以忍受簡單的關鍵限制,那麼我可以嘗試這種技術。對於有限類型的集合,我不會這樣做。我只是通過本書來實現,爲每種類型分別實施堆接口。這不是那麼多的工作,也沒有那麼多的代碼。

0

我不確定我是否理解這個問題。

我使用的接口{}作爲存儲類型在這裏實現一個隊列(和堆棧和環):

https://github.com/iNamik/go_container

使用接口{}允許你保存你想要的任何類型的 - 儘管它不能幫助你執行類型ala泛型,它會完成工作。

我可以看到創建優先隊列沒有太多麻煩。

我錯過了什麼嗎?

我很樂意添加一個優先級隊列容器,如果你認爲你會發現它有用。