在Go语言中返回其结构的地址的方法

时间:2018-03-24 12:17:36

标签: go data-structures linked-list

在我尝试创建链表数据结构时,我已经声明了两个结构。

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()

1 个答案:

答案 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。