繁体   English   中英

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

[英]How to construct nested structs with slices

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

主.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 的类

制程.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)
}

和一个类

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

屏幕Output:

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

预期屏幕 Output:

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

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

问题:我所知道的是,切片append function 按值复制。 然后,无需创建指针切片即可复制Process对象/结构。 因此,进程结构被认为是不可分割的 object。 真的吗? 有什么误会吗? 代码有什么问题吗?

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

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

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

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

另一个重点:导出以大写字母开头的函数、方法或变量/成员(与公共相同),以小写开头未导出(更像私有或更好的 package 级别访问)。

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

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

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

代替

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM