在创建链接列表数据结构的尝试中,我声明了两个结构。

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。

09-30 00:19