为了账号安全,请及时绑定邮箱和手机立即绑定

构建接口。

构建接口。

Go
江户川乱折腾 2022-06-06 17:43:46
我编写了以下运行良好的代码: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定义了 == 和 != 时才有效。由于这些运算符不是用户可定义的,因此只能使用定义它们的内置/预声明类型。因此,您可以用作Ts 的唯一类型是无论如何都可以用作普通映射键的类型。所以你一无所获。

(但老实说,我不知道您的界面T有什么用,特别是考虑到您不能使用该界面进行排序;或者您的代码试图做什么。这看起来像一个 XY 问题。)


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号