我编写了以下运行良好的代码: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 关注
- 143 浏览
添加回答
举报
0/150
提交
取消