我试图理解如何在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的错)。
提前感谢:)
在当前代码中,有两个类型为Entity
的对象。一个名为e1
,另一个名为数据库[1]
。这两个对象是完全独立的,因为它们是struct
s。因此,更改其中一个对象时,不会影响另一个对象。(小的例外:对项的一些更改将被共享,但不是全部。)
如果你想先将实体添加到映射中,然后再修改它,你应该使用指针映射,
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语言还进一步考虑到无限循环的场景,让开发者不用写无聊的 和 ,而直接简化为如下的写法: