如何用切片构造嵌套结构
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 代码。
我正在构建一个简单的群组管理器,其中我只与您分享相关部分。我很难理解这些东西在没有构造函数(尤其是复制构造函数)的类对象结构中是如何工作的。
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 代码。