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

标签 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))
}

在这里,我定义了一个类型Vector,其中包含xyz,并且我'我们定义了函数 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/

相关文章:

go - 使用 KMS 时尝试将一些代码转换为 Go CDK

dictionary - 如何使用反射反转 map

为所有处理程序设置标题

oop - 只写属性有实际应用吗?

java - 如何避免在函数(JAVA)中返回 NULL 值?

Android - 数据库类结构 OOP

php - 使用构造函数创建新对象时出现 undefined variable 错误

objective-c - 声明 Objective C 对象时哪个更有效

go - 使用包变量而不是创建局部变量

go - 编码后如何限制JSON字符串的长度?