在我尝试创建链表数据结构时,我已经声明了两个结构。
package main
import "fmt"
type listElement struct {
data int
next *listElement
}
type List struct {
first *listElement
last *listElement
len int
}
我想创建一个返回空列表的方法。到目前为止,我只能创建函数
func new() *List {
return &List{}
}
这与我在多个数据结构存储库中看到的结果相同。是否可以创建一个返回新空列表的方法List.new()
?
答案 0 :(得分:2)
是的,当然你可以定义一个返回List值的方法,但由于你需要一个List值来调用一个方法,这有点尴尬:
package main
type List struct{}
func (List) New1() *List {
return &List{}
}
func (*List) New2() *List {
return &List{}
}
func main() {
_ = List{}.New1()
_ = (&List{}).New2()
_ = (*List)(nil).New2()
}
老实说,我不知道这比NewList函数更好,这在Go中是惯用的:
func NewList() *List {
return &List{}
}
如果您的包名为list,请将该函数命名为New,因此将其命名为list.New()
。
在所有情况下,论据和正文都是相同的。它们仅在调用方式上有所不同,并且包函数最容易使用。 (请参阅JimB评论中的链接,了解另一个略有不同的变体。)
您似乎尚未阅读Effective Go,这表明上述大部分内容。
创建ring.Ring的新实例的函数 - 这是Go中构造函数的定义 - 通常称为NewRing,但由于Ring是包导出的唯一类型,并且由于包被称为ring,它只被称为New,该软件包的客户端看作是ring.New。