【问题标题】:Creating a struct that contains list types in go在 go 中创建一个包含列表类型的结构
【发布时间】:2019-01-02 08:50:27
【问题描述】:

我创建了一个结构,这个结构中包含两个列表类型。当我尝试实例化我的结构时,我收到错误

cannot use list.New() (type *list.List) as type list.List in field value

我正在使用 golang 游乐场

结构

type myStruct struct {
    name string
    messages list.List
    users list.List
    lastUsed time.Time
}

实例化结构

var myVar = myStruct{"hello", list.New(), list.New(), time.Now()}

【问题讨论】:

  • 错误信息非常清楚:您正在尝试将指针分配给具体值。
  • @Flimzy 错误消息没有提到指针或具体值,所以我不清楚。我现在明白 * 表示指针,但我已经有几年没有使用指针了。
  • 嗯,它确实提到了这些。 *list.List 表示指针,list.List 表示具体值。如果这些概念对您来说是新概念,您应该从 A Tour of Go 开始。
  • @Flimzy 它们不是新的,我只是生疏了使用它们,我已经完成了那次巡演。

标签: list go struct


【解决方案1】:

list.New() 返回一个指针*List,而myStruct 将其字段声明为List

func New() *列表

消息和用户应该是*list.List

type myStruct struct {
    name string
    messages *list.List
    users *list.List
    lastUsed time.Time
}

根据您的需要的另一种方法,您可以初始化结构如下:

var myVar = myStruct{"hello", *list.New(), *list.New(), time.Now()}

【讨论】:

  • 谢谢,使用指向列表的指针会导致任何问题吗?我的初衷是只使用列表而不使用指针。有没有办法将新列表传递给结构而不是传递指针?
  • 所以现在您在创建 list.New() 时取消引用它,以便将实际列表传递到结构中,对吗?
  • 如果你在函数调用中添加它,你必须从结构中删除'*'。我不确定我应该使用哪一个。该结构将成为一个聊天室,其中包含一个消息列表和一个用户列表。我正在将这些聊天室添加到我程序中的全局列表中。我希望结构具有指向列表或具体列表的指针吗?
  • @Jacob 见pointers vs values
【解决方案2】:

您正在创建错误的结构,因为 go,根据 listNew() 方法返回列表的指针类型,并且您在没有指针的结构中创建了 list

func New() *List

因此,根据文档,您需要创建如下结构:

type myStruct struct {
    name string
    messages *list.List
    users *list.List
    lastUsed time.Time
}

Go Playground

【讨论】:

  • 谢谢,使用指向列表的指针会导致任何问题吗?我的初衷是只使用列表而不使用指针。有没有办法将新列表传递给结构而不是传递指针?
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多