go - Go构造函数中的返回值与指针

标签 go constructor pass-by-value

在 go 中构建一个简单的对象时,这些替代方案有什么区别?

func NewGender(value string) Gender {
    return Gender{strings.TrimSpace(value)}
}

func NewGender(value string) *Gender {
    return &Gender{strings.TrimSpace(value)}
}

最佳答案

这个问题非常广泛,很大程度上取决于 API 的其余部分。因此,这里只是您在选择一个而不是另一个时可能需要考虑的一些事项(无特定顺序):

  • 不必要的指针会给 GC 带来更多的工作。您可能会通过返回一个指针(一个字)而不是一个结构(零到多个字)来赢得一些时间,但其中一些时间可能稍后会被 GC 扫描消耗掉。

  • 指针也可以表示某事物的存在或不存在,尽管通常最好使用 comma-ok 习惯用法,否则会返回错误。

  • 说到错误,如果返回 nil 有错误,错误被忽略的机会就更小了(因为 nil 指针取消引用会导致 panic)。再说一次,我不认为忽略错误的人是你真正应该考虑的事情。

  • 如果您需要某种形式的跟踪(例如,检查构造函数创建的所有实例的可能性),您必须返回一个指针,以便检查器可以看到对值的所有更改.

  • 如果大多数类型的方法都有一个指针接收器,或者 API 中的大多数函数接受指向该类型而不是值的指针,则返回指针更符合人体工程学。

关于go - Go构造函数中的返回值与指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32208363/

相关文章:

c# - 什么是 'this' 构造函数,它有什么用

go - Go 中的 Getter 和 Setter 约定

c++ - 运行时检查失败 #2 S C++

docker - 如何禁用 CGO 以运行测试

go - 根据请求中的cookie设置http.FileServer的根文件系统

c# - 非静态类中静态构造函数的作用是什么?

c++ - 使用 initializer_list 上的数据

go - 从 golang 连接到 kubernetes-aerospike 网格集群

go - 解释函数声明的语法

java - 使用 JNA 在 Clojure 中按值获取和传递结构