Go中的面向对象编程 - 使用“new”关键字还是不?

时间:2015-11-18 19:36:48

标签: oop go

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

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("%d\n", (vect.x * vect.y * vect.z))
}

在这里,我使用Vectorxy定义了一个z类型,并且我定义了一个声明指针的函数VectorFactoryVector并返回该指针。我使用此函数创建一个名为Vector的新vect

  • 这是不好的代码?我应该使用new关键字而不是构建Factory吗?
  • 使用后我是否需要delete Vector,就像在C ++中一样?如果是这样,怎么样?

感谢。我还在等待送我的Go书。

1 个答案:

答案 0 :(得分:2)

首选NewThingThingFactory

不要制作NewThing函数,除非您有复杂的初始化,或者您故意不导出结构的某些部分。仅选择性地设置结构的一部分并不复杂,这可以通过使用标签来实现。复杂的事情就像"插槽Q的值取决于插槽Zorb的值是什么"。未记录的结构字段可用于信息隐藏,但应谨慎使用。

Go是垃圾收集的,任何未引用的数据都有资格被收集。开始时不要担心,然后达到这样的程度,确保你清理对你不再感兴趣的数据的任何引用,以避免意外的活跃("意外的活跃"基本上是GC相当于"内存泄漏")。

如果您希望经常打印数据结构,请考虑为它们创建String方法(这与您执行的打印不完全对应,但通常对于矢量更有用):

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

除非&#34; vect&#34;对你来说真的意味着什么,更喜欢&#34; v&#34;或&#34; vector&#34;作为一个名字。