如何用切片构造嵌套结构

How to construct nested structs with slices

我正在构建一个简单的群组管理器,其中我只与您分享相关部分。我很难理解这些东西在没有构造函数(尤其是复制构造函数)的类对象结构中是如何工作的。

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

我有一个类似于 class 的流程

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

和一群class-like

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

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

在这里,我会为您提供一些提示。当我开始使用 golang 时,这主要是我的学习。 不仅要匹配语法,还要匹配大小写。

type processFuncs interface {
    **printProcess**()
}

//PrintProcess prints a process contents
func (p Process) **PrintProcess**() {

    fmt.Printf("[P%d; %s]\n", p.ID, p.Address)
}

另一个重点:以大写字母开头的函数、方法或variables/members被导出(与Public相同),以小写字母开头未导出(更像是私有或更好的包级访问).

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

其次,如果您想通过方法调用修改类型对象,请使用指针引用而不是值,即

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

而不是

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

最重要的是 Go 不像 Java 或 C# 或任何其他 OO 语言所以不要在 golang 中编写 OO 代码。