在创建链接列表数据结构的尝试中,我声明了两个结构。
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()
方法? 最佳答案
是的,您当然可以定义一个返回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()
。在所有情况下,论点和主体都是相同的。它们仅在调用方式上有所不同,并且package函数最易于使用。 (有关另一个稍有不同的变体,请参见JimB注释中的链接。)
看来您尚未阅读Effective Go,它暗示了上面的大部分内容。
制作ring的新实例的函数。Ring(这是Go中构造函数的定义)通常被称为NewRing,但是由于Ring是该包导出的唯一类型,并且由于该包被称为ring,因此将其称为just新建,该软件包的客户端将其视为ring.New。