亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

構建接口。

構建接口。

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 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號