簡體   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