我正在学习 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))
}
在这里,我定义了一个类型Vector
,其中包含x
、y
和z
,并且我'我们定义了函数 VectorFactory
,它声明一个指向 Vector
的指针并返回该指针。我使用此函数创建一个名为 vect
的新 Vector
。
- 这是错误的代码吗?我应该使用
new
关键字而不是构建Factory
吗? - 我是否需要在使用后
删除
Vector
,就像在 C++ 中一样?如果是,怎么做?
谢谢。我还在等待我的围棋书送到。
最佳答案
比 ThingFactory
更喜欢 NewThing
。
不要制作 NewThing
函数,除非您有复杂的初始化,或者您有意不导出结构的一部分。有选择地只设置结构的一部分并不复杂,可以通过使用标签来完成。复杂的是诸如“插槽 Q 的值取决于插槽 Zorb 的值是什么”之类的东西。未导出的结构字段可用于信息隐藏,但应谨慎使用。
Go 是垃圾收集的,任何未被引用的数据都有资格被收集。一开始不要担心它,然后确保清除对不再感兴趣的数据的任何引用,以避免意外活跃(“意外活跃”本质上是 GC 等同于“内存泄漏” ").
如果您希望频繁打印您的数据结构,请考虑为它们制作一个 String
方法(这与您所做的打印不完全对应,但通常对矢量可能更有用):
func (v Vector) String() string {
return fmt.Sprintf("V<%d, %d, %d>", v.x v.y, v.z);
}
除非“vect”对您来说真的有意义,否则更喜欢“v”或“vector”作为名称。
关于oop - Go 中的面向对象编程——使用 "new"关键字还是不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33788848/