如何用切片构造嵌套结构体



我正在构建一个简单的组管理器,我只与您分享相关部分。我在理解没有构造函数(特别是复制构造函数)的类对象结构中如何工作时遇到了麻烦。

main.go

var currentGroup Headers.Group
func main() {
currentGroup.New(0)
p := Headers.Process{ID: uint16(len(currentGroup.Processes)), Address: "Test"}
currentGroup.AddProcess(p)
p.PrintProcess()
currentGroup.PrintGroup()
}

我有一个类,叫做Process

Process.go

//Process defines a Process structure
type Process struct {
ID      uint16
Address string
}
type processFuncs interface {
printProcess()
}
//PrintProcess prints a process contents
func (p Process) PrintProcess() {
fmt.Printf("[P%d; %s]n", p.ID, p.Address)
}

和一个组类

Group.go

// Group struct
type Group struct {
ID        uint16
Processes []Process
}
//AddProcess adds a process to the group
func (G Group) AddProcess(p Process) {
G.Processes = append(G.Processes, p)
}
//PrintGroup prints the group processes
func (G Group) PrintGroup() {
fmt.Printf("=========================nGroup %d:n", G.ID)
for i := 0; i < len(G.Processes); i++ {
G.Processes[i].PrintProcess()
}
}
//New Group Constructor
func (G Group) New(ID uint16) {
G.ID = ID
G.Processes = make([]Process, 0)
}

屏幕输出:

[P0; Test]
=========================
Group 0:

期望屏幕输出:

[P0; Test]
=========================
Group 0:
[P0; Test]

问题:Process p创建并打印成功,但未添加到currentGroup

问题:我所知道的是,切片append函数按值复制。然后,复制Process对象/结构,而不需要创建指针切片。因此,进程结构被认为是一个不可分割的对象。这是真的吗?误解吗?代码有什么问题吗?

这里我给你一些提示。这些都是我开始学golang的时候学到的。请不仅匹配语法,而且匹配大小写。

type processFuncs interface {
**printProcess**()
}
//PrintProcess prints a process contents
func (p Process) **PrintProcess**() {
fmt.Printf("[P%d; %s]n", p.ID, p.Address)
}

另一个重点:以大写字母开头的函数、方法或变量/成员被导出(与Public相同),以小写字母开头的unexport(更像private或更好的包级访问)。

您通常公开您的接口并使实际类型不被导出。添加一个新方法来创建类型对象。

第二,如果你想通过方法调用修改类型对象,使用指针引用而不是值,即

Use func (p *Process) PrintProcess(){
//... do something
}

不是

func (p Process) PrintProcess(){
//... do something
}

最重要的是Go不像Java或c#或任何其他面向对象语言,所以不要用golang编写面向对象代码。

相关内容

  • 没有找到相关文章

最新更新