Go 中的面向对象编程 -- 使用 "new" 关键字还是 no?



我正在学习围棋,我有一个基于以下代码的问题:

package main
import (
    "fmt"
)
type Vector struct {
    x, y, z int
}
func VectorFactory(x,y,z int) *Vector {
    return &Vector{x, y, z}
}
func main() {
    vect := VectorFactory(1, 2, 3)
    fmt.Printf("%dn", (vect.x * vect.y * vect.z))
}

在这里,我定义了一个具有xyz的类型Vector,并定义了函数VectorFactory,该函数声明指向Vector的指针并返回该指针。我使用这个函数来创建一个名为vect的新Vector

  • 这是坏代码吗?我应该使用new关键字而不是构建Factory
  • 使用Vector后,我是否需要像C++中那样delete?如果是,如何

谢谢。我还在等我的围棋书送过来。

首选NewThing而不是ThingFactory

不要生成NewThing函数,除非您有复杂的初始化,或者您有意不导出结构的部分。选择性地只设置结构的一部分并不复杂,这可以通过使用标签来实现。复杂的情况可能是"槽Q的值取决于槽Zorb的值"。未分解的结构字段可以用于信息隐藏,但应小心使用。

Go是垃圾收集的,任何未被引用的数据都有资格被收集。一开始不必担心,然后确保清除对不再感兴趣的数据的任何引用,以避免意外活跃("意外活跃"本质上相当于"内存泄漏")。

如果你希望经常打印你的数据结构,可以考虑为它们制作一个String方法(这与你所做的打印不完全对应,但通常对向量更有用):

func (v Vector) String() string {
  return fmt.Sprintf("V<%d, %d, %d>", v.x v.y, v.z);
}

除非"vect"对你来说真的有意义,否则你更喜欢用"v"或"vector"作为名字。

最新更新