我正在学习围棋,我有一个基于以下代码的问题:
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))
}
在这里,我定义了一个具有x
、y
和z
的类型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"作为名字。