3

有没有更好的方法来只返回多个返回值中的一个?

func makeRune(s string) (r rune) {
    r, _ = utf8.DecodeRuneInString(s)
    return
}
4

1 回答 1

7

是的。您应该添加评论说明您这样做的原因。因为这样做的动机经常被误导,人们会质疑它,就像他们在对你的 OP 的评论中所说的那样。如果你有充分的理由编写一个函数来抛出一个返回值,请在评论中证明它的合理性。也许你可以写,

// makeRune helper function allows function chaining.
func makeRune(s string) (r rune) {
    // toss length return value.  for all use cases in this program
    // only the first rune needs to be decoded.
    r, _ = utf8.DecodeRuneInString(s)
    return
}

这也有助于通过遵循经验法则来进行代码审查,“如果注释和代码不一致,那么两者都可能是错误的。” 如果不需要函数链接,那么函数的整个目的是有问题的。如果您的评论表明您认为您正在抛出错误值,那将是一个危险信号。如果您的评论表明您认为 s 只能包含一个符文,那也是一个危险信号。鉴于上面的示例注释,我可能会阅读我所写的内容并决定将该函数命名为 firstRune 更好。这具有更具体的含义,并避免暗示类似于 Go make 函数的语义。

于 2012-11-17T15:21:46.977 回答