在Go中,可以在函数的签名中明确声明返回值的名称。这些值会自动初始化为其类型的零值。在处理多个返回变量时,这种方式非常方便,允许通过没有参数的return语句隐式地“返回”值。
示例:
func foo() (x int, err error) { if someCheck() { x = 1 return // 将返回 (1, nil) } return // 将返回 (0, nil),如果x和err没有被显式赋值 }
细节:
nil)。这可能掩盖逻辑中的错误。如果函数只包含命名结果而没有对返回变量进行赋值,简单调用return时会返回什么?
答案:将返回它们的零值。例如,对于int来说是0,对于指针来说是nil。
示例:
func test() (res *MyType, code int) { return // 同样是 "return nil, 0" }
故事
在一个金融服务中,忘记在命名返回的函数内部给err(error)变量赋值。因此,在出现故障时,函数返回nil,错误丢失。结果导致交易处理失败,部分操作被忽视。
故事
在重构函数时,增加了一个新的命名返回结果,但与之前返回类型的不兼容性没有被发现——测试由于返回零值而漏掉了这个问题,导致存储中的沉默错误。
故事
在某个辅助函数中,通过命名结果记录错误,但有时忘记在返回时处理它们,而在日志记录时也是如此,导致难以重现的bug(“错误丢失”)。