构造函数如出错应该返回空指针还是空对象?

初学 Go, 有些困惑。如以下代码:


type Circle struct {
radius float64
}

func NewCircle(radius float64) (c *Circle, err error) {
if radius < 0 {
err = fmt.Errorf("Invalid argument.")
return c, err // No memory allocation in case of EINVAL.
}

c = new(Circle)
c.radius = radius

return c, err
}

若调用 c, err := NewCircle(-1) 则 c 为 nil


但如果把 c = new(Circle) 放在判断参数合法性的上方,返回的则是 &{0}


采取哪种方式比较好呢?

已邀请:

Xargin - 滴滴打杂工

赞同来自: 梁昊 cholerae

err != nil 的时候说明返回的内容不可靠,所以实际上根本无所谓

simple - 分布式 & Java & Go

赞同来自: 梁昊

如果err!=nil你都不会在用这个对象实例,为什么要new出来?new出来还有可能导致内存泄漏.

LockingCoder - 80后

赞同来自:

楼上说的都对,哈哈

梁昊

赞同来自:

谢谢,看来是可以节省无用的内存分配
从另一个角度看,如果调用者忽略 err != nil 强行继续操作空指针,在编译阶段就会遇到问题。如果是空对象,在运行期引发隐藏的问题可不好。

要回复问题请先登录注册