我正在构建一个简单的组管理器,我只与您分享相关部分。我在理解没有构造函数(特别是复制构造函数)的类对象结构中如何工作时遇到了麻烦。
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编写面向对象代码。