對不明的標題感到抱歉。使用空接口實施「通用」代碼中的類型
我讀這本書http://algs4.cs.princeton.edu/home/,我認爲這將是很好的落實圍棋的例子作爲一個學習鍛鍊,但書中使用Java作爲其語言來描述代碼。
一個第一章節討論設置一些核心數據類型/容器樣式類以供稍後重新使用,但我無法嘗試將這些內容嵌入到Go設置中,主要是因爲這些數據類型似乎正在享受Java泛型的使用。
舉例來說,我已經寫了下面的代碼
package bag
type T interface{}
type Bag []T
func (a *Bag) Add(t T) {
*a = append(*a, t)
}
func (a *Bag) IsEmpty() bool {
return len(*a) == 0
}
func (a *Bag) Size() int {
return len(*a)
}
這工作原則上,我可以將項目添加到Bag
並檢查它的大小和一切的感覺。然而,這也意味着下面的代碼是合法
a := make(bag.Bag,0,0)
a.Add(1)
a.Add("Hello world!")
a.Add(5.6)
a.Add(time.Now())
我只是想知道是否有強制執行的任何類型的方式,以便它符合類似
Bag<T> bagOfMyType = new Bag<T>()
例如合同
Bag<Integer> bagOfInts = new Bag<Integer>()
我知道Go沒有泛型和他們沒有真正的去路,但我只是想知道,如果它是一個可以在編譯的時候「強制執行」任何東西(可能不是)
很抱歉的長期職位
編輯:行,所以我一直在尋找到這一點進一步,我已經差不多事物的仿製藥側(我明白這不是在路線圖放棄去),所以我正在考慮做類似於帶有接口的Haskell類型類的東西,例如
type T interface{}
type Bag interface {
Add(t T)
IsEmpty() bool
Size() int
}
type IntSlice []int
func (i *IntSlice) Add(t T) {
*i = append(*i, t.(int)) // will throw runtime exception if user attempts to add anything other than int
}
func (i *IntSlice) IsEmpty() bool {
return len(*i) == 0
}
func (i *IntSlice) Size() int {
return len(*i)
}
問題在於這種類型的執行只在運行時執行。
任何人有任何想法如何改善呢?
感謝您的答覆。我可以看到的唯一問題是,如果你想在任何帶'''Bag'''接口的函數中使用''''Add'''方法作爲參數(它不起作用),但我想這就是你必須用這個解決方案進行的交易...... – djhworld 2012-08-10 21:10:11
所以,如果你想使它不是通用的,你需要創建一個函數來處理IntBag,這是處理交易的另一個函數用''''''''''''''''''等等,除非您創建某種類型的「調度器」入口點,反映在Bag包上,並根據類型分配呼叫。這仍然意味着編寫'''n'''函數,儘管 – djhworld 2012-08-10 21:21:31
@djhworld我在回答底部添加了更新以迴應您的意見。 – 2012-08-10 22:09:52