簡體   English   中英

如何在Go中嵌入和覆蓋結構

[英]How to embed and override a struct in Go

我正在構造int的最小/最大堆,以滿足container/heap的接口。

最小堆工作良好,例如

type MinHeapInt []int

func (h MinHeapInt) Len() int {
    return len(h)
}

func (h MinHeapInt) Less(i, j int) bool {
    return h[i] < h[j]
}

func (h MinHeapInt) Swap(i, j int) {
    h[i], h[j] = h[j], h[i]
}

func (h *MinHeapInt) Peek() interface{} {
    return (*h)[0]
}

func (h *MinHeapInt) Push(x interface{}) {
    *h = append(*h, x.(int))
}

func (h *MinHeapInt) Pop() interface{} {
    length := len(*h)
    res := (*h)[length - 1]
    *h = (*h)[0 : length - 1]
    return res
}

現在,我試圖通過僅重寫Less方法來開發最大堆。

第一個解決方案不起作用,因為它找不到數組

type MaxHeapInt struct {
    MinHeapInt
}

func (h MaxHeapInt) Less(i, j int) bool {
    return h[i] > h[j]
}

第二種解決方案僅保留Less方法。

type MaxHeapInt MinHeapInt

func (h MaxHeapInt) Less(i, j int) bool {
    return h[i] > h[j]
}

想知道是否還有可以繞開的地方。 謝謝!

您的第一個解決方案是嘗試索引MaxHeapInt結構,而不是MinHeapInt切片。

type MaxHeapInt struct {
    MinHeapInt
}

func (h MaxHeapInt) Less(i, j int) bool {
    return h.MinHeapInt[i] > h.MinHeapInt[j]
}

如果希望它們初始化相同,則創建部分堆實現,並包裝所需的結構(類似於sort包中的包裝器示例 )。

type Max struct{ IntHeap }

func (h Max) Less(i, j int) bool {
    return h.IntHeap[i] > h.IntHeap[j]
}

type Min struct{ IntHeap }

func (h Min) Less(i, j int) bool {
    return h.IntHeap[i] < h.IntHeap[j]
}

type IntHeap []int

func (h IntHeap) Len() int { return len(h) }

func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }

func (h *IntHeap) Peek() interface{} { return (*h)[0] }

func (h *IntHeap) Push(x interface{}) {
    *h = append(*h, x.(int))
}

func (h *IntHeap) Pop() interface{} {
    length := len(*h)
    res := (*h)[length-1]
    *h = (*h)[0 : length-1]
    return res
}

// Now these can be initialized like
//     Min{IntHeap{1, 2, 3}}
//     Max{IntHeap{1, 2, 3}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM