构建接口。

我编写了以下运行良好的代码:


package main


import "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 > start

func (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 methods

func (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()

}

我该怎么做?


江户川乱折腾
浏览 144回答 1
1回答

MMTTMM

你一般不能这样做。您的hashMap包含一个map[T]T. 来自https://golang.org/ref/spec#Map_types:比较运算符 == 和 != 必须为键类型的操作数完全定义;因此键类型不能是函数、映射或切片。如果键类型是接口类型,则必须为动态键值定义这些比较运算符;失败将导致运行时恐慌。(强调补充)。因此,这仅在您的实现T定义了 == 和 != 时才有效。由于这些运算符不是用户可定义的,因此只能使用定义它们的内置/预声明类型。因此,您可以用作Ts 的唯一类型是无论如何都可以用作普通映射键的类型。所以你一无所获。(但老实说,我不知道您的界面T有什么用,特别是考虑到您不能使用该界面进行排序;或者您的代码试图做什么。这看起来像一个 XY 问题。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go