gpt4 book ai didi

list - 为什么 golang list/ring 的 Element 和 Ring 结构?

转载 作者:IT王子 更新时间:2023-10-29 00:39:39 26 4
gpt4 key购买 nike

为什么 golang 中的列表/环类型为单个项目使用额外的结构 Element/Ring 而不是 interface{} ?我假设有一些好处,但我看不到。

编辑:我的意思是询问 api,而不是关于在实现中使用 Element/Ring。该实现仍然可以使用非导出类型,但让 api 提供和接受接口(interface){},那么为什么要让用户进出 Element/Ring?

Edit2:举个例子,列表 Back() 函数可能是这样的

func (l *List) Back() interface{} {
if l.len == 0 {
return nil
}
return l.root.prev.Value
}

列表仍然在内部使用 Element 但它只是元素(未导出),因为它不会返回它而只返回值。

最佳答案

container/list 是链表,因此拥有可以对整个列表进行操作并跟踪列表的开头和结尾的 List 结构将是有益的。

由于它是一个链接列表,您希望能够将项目链接在一起并从一个项目导航到下一个或上一个项目。这需要一个结构来保存指向下一个和上一个项目的指针,并允许您导航到这些项目(使用 Next() 和 Prev() 函数)。 Element 结构用于此目的,它包含指向下一个/上一个项目的指针以及实际值。

这是结构体的定义方式,它们还有各种成员函数

type List struct {
root Element // sentinel list element, only &root, root.prev, and root.next are used
len int // current list length excluding (this) sentinel element
}

type Element struct {
// Next and previous pointers in the doubly-linked list of elements.
// To simplify the implementation, internally a list l is implemented
// as a ring, such that &l.root is both the next element of the last
// list element (l.Back()) and the previous element of the first list
// element (l.Front()).
next, prev *Element

// The list to which this element belongs.
list *List

// The value stored with this element.
Value interface{}
}

容器/环没有你暗示的“额外”结构。只有 Ring 结构将一个项目链接到下一个/上一个项目并保存值。 Ring 没有开始/结束,因此不需要有一个在整个环上运行或跟踪开始的结构。

type Ring struct {
next, prev *Ring
Value interface{} // for use by client; untouched by this library
}

关于list - 为什么 golang list/ring 的 Element 和 Ring 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24272789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com