我編寫了以下運行良好的代碼:package mainimport "fmt"type hashMap interface {}type hashMap struct { m map[hashable]hashable k []hashable}type hashMap struct { m map[T]T k []T}// Methods required to enable sort: Len, Less, Swap > startfunc (h *hashMap) Len() int { return len(h.m)}func (h *hashMap) Less(i, j int) bool { switch v := h.m[h.k[i]].(type) { case int: return v > h.m[h.k[j]].(int) case float32: return v > h.m[h.k[j]].(float32) case float64: return v > h.m[h.k[j]].(float64) case string: return v > h.m[h.k[j]].(string) default: return false }}func (h *hashMap) Swap(i, j int) { h.k[i], h.k[j] = h.k[j], h.k[i]}// Methods required to enable sort: Len, Less, Swap > end// Build Ordered Map methodsfunc (h *hashMap) from(m map[T]T) hashMap { h.m = m h.k = make([]T, 0, len(m)) for key := range m { h.k = append(h.k, key) } return *h}func main() { inv := new(hashMap).from(map[T]T{"first:": 1, "second": 2}) fmt.Printf("%v", inv)}我想type T interface {}使用以下內容替換空界面:type T interface { Len() int Less() bool Swap()}我該怎么做?
1 回答

MMTTMM
TA貢獻1869條經驗 獲得超4個贊
你一般不能這樣做。
您的hashMap
包含一個map[T]T
. 來自https://golang.org/ref/spec#Map_types:
比較運算符 == 和 != 必須為鍵類型的操作數完全定義;因此鍵類型不能是函數、映射或切片。如果鍵類型是接口類型,則必須為動態鍵值定義這些比較運算符;失敗將導致運行時恐慌。
(強調補充)。
因此,這僅在您的實現T
定義了 == 和 != 時才有效。由于這些運算符不是用戶可定義的,因此只能使用定義它們的內置/預聲明類型。因此,您可以用作T
s 的唯一類型是無論如何都可以用作普通映射鍵的類型。所以你一無所獲。
(但老實說,我不知道您的界面T
有什么用,特別是考慮到您不能使用該界面進行排序;或者您的代碼試圖做什么。這看起來像一個 XY 問題。)
- 1 回答
- 0 關注
- 138 瀏覽
添加回答
舉報
0/150
提交
取消