在Go构造函数中返回值与指针

Pab*_*dez 10 constructor pass-by-value go

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

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

func NewGender(value string) *Gender {
    return &Gender{strings.TrimSpace(value)}
}
Run Code Online (Sandbox Code Playgroud)

Ain*_*r-G 12

问题是一个非常广泛的问题,它在很大程度上取决于您的其他API.所以这里只是你在选择一个而不是特定顺序时可能需要考虑的一些事情:

  • 不必要的指针导致GC的更多工作.您可能通过返回指针(一个单词)而不是结构(零到多个单词)来赢得一些时间,但有些时间可能稍后被GC扫描使用.

  • 指针也可以指示事物的存在或不存在,尽管通常使用逗号成语更好,或者返回错误.

  • 说到错误,如果返回nil错误,错误被忽略的可能性会更小(因为nil指针取消引用会导致混乱).然后,我不认为忽视错误的人是你应该考虑的事情.

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

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