当前位置: 首页 > 知识库问答 >
问题:

Go语言追加到结构内的切片

翟曦之
2023-03-14

我试图理解如何在Go中操作数据结构,以及它指向指针(带有副本或引用)的方法。

我的代码在Go Playground这里:https://play.golang.org/p/j_06RS5Xcz

我制作了一个结构的切片图,里面还有一个其他东西的切片。

在这里:

type Item struct {
    Name        string
    Description string
}

type Entity struct {
    Base   Item
    Others []Item
}

var database map[int][]Entity

func main() {
    database = make(map[int][]Entity)
    database[1] = []Entity{}

    e1 := Entity{}
    e1.Base = Item{"A", "aaa"}
    e1.Others = []Item{}

    database[1] = append(database[1], e1)

    // later, I want to add other items to my entity
    e1.Others = append(e1.Others, Item{"B", "bbb"})

    // other items field is empty
    fmt.Println(database)
}

// prints: map[1:[{{A aaa} []}]]

我想在以后的程序中附加其他项。似乎我必须使用指针来解决这个问题,但我不知道如何解决。

我的实体应该是这样吗?

type Entity struct {
    Base   Item
    Others *[]Item
}

如果是这样的话,我应该如何向它添加项目?这样地?

*e1.Others = append(*e1.Others, Item{"B", "bbb"})

...

...

...

我也不清楚我是否必须这样做:数据库[1]=[]实体{}在数据库[1]=append(数据库[1],e1)之前,或者我可以追加这个案子。我在e1上尝试了同样的方法。其他人=[]项目{},但它没有产生相同的效果来追加(我知道这是我的误解,不是Go的错)。

提前感谢:)

共有1个答案

贲铭
2023-03-14

在当前代码中,有两个类型为Entity的对象。一个名为e1,另一个名为数据库[1]。这两个对象是完全独立的,因为它们是structs。因此,更改其中一个对象时,不会影响另一个对象。(小的例外:对项的一些更改将被共享,但不是全部。)

如果你想先将实体添加到映射中,然后再修改它,你应该使用指针映射,map[int][]*Entity。然后,您应该用e1:=创建一个指向实体的指针,而不是Entity{}

但是,print语句将有所不同。它不会打印结构,而是只打印指针值。要解决此问题,请添加字符串方法:

func (e *Entity) String() string { return fmt.Sprint(*e) }

看见https://play.golang.org/p/edU7E5Gnjw,我还移除了不必要的空切片。附加到nil切片完全可以。

为了进一步阅读,我建议http://research.swtch.com/godata,它将回答您当前的问题。

 类似资料:
  • 在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello World!": package main import "fmt" func main() { /* 这是我的

  • 我试图实现2个简单的结构如下: 我做错了什么?我只想在box结构上调用addItem方法并传入一个项

  • 问题内容: 我正在尝试学习Go并遵循现有的约定,但是,作为每个约定,您都需要先了解它们,然后才能很好地使用它们,经过一些研究,我没有找到以下问题的确切答案: 我已经在自己的内部建立了一个类似以下结构的项目: 我的主要是: 因此,问题是: 我读到我需要在每个package文件夹中都有一个文件,对吗? 如果是这样,在内部,我将如何导入,以及? 然后,是否可能会有类似的内容: …并且主要是做什么的? 问

  • Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性: Title :标题 Author : 作者 Subject:学科 ID:书籍ID 定义结构体 结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据

  • 主要内容:从数组或切片生成新的切片,直接声明新的切片,使用 make() 函数构造切片切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/ C++ 中的数组类型,或者 Python 中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。 Go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“

  • 主要内容:for 中的初始语句——开始循环时执行的语句,for 中的条件表达式——控制是否循环的开关,for 中的结束语句——每次循环结束时执行的语句与多数语言不同的是,Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C语言和 C++ 中非常接近: 可以看到比较大的一个不同在于 for 后面的条件表达式不需要用圆括号 括起来,Go语言还进一步考虑到无限循环的场景,让开发者不用写无聊的  和 ,而直接简化为如下的写法: