【问题标题】:Return only the first result of a multiple return values in golang只返回golang中多个返回值的第一个结果
【发布时间】:2018-10-27 03:33:33
【问题描述】:

这里绝对是新手问题。

Go 中的某些函数返回多个值(通常是值和错误)。我正在编写一个函数,它返回其中一个函数的返回值,即使很容易将值放在变量上并只返回第一个,我怀疑我是否可以只在一行中做同样的事情没有额外的变量。这是 C、Java、C#、Ruby 等其他语言中经常使用的东西

func someFunc (param string) int {
   // do something with the string, not very important
   return strconv.Atoi(param) 
}

我知道这行得通

func someFunc (param string) int {
   // do something with the string, not very important
   var result int
   result, _ = strconv.Atoi(param)
   return result 
}

这在 Go 中可能吗?它被认为是一种“好的做法”(就像在 Java* 中一样)

注意:在有人说这种技术在 Java 中不是一种好的做法之前,请澄清这对于这个问题并不重要,但有些人(比如我工作的公司中的人)鼓励这种风格。

【问题讨论】:

    标签: go


    【解决方案1】:

    使用short variable declaration 以最短的代码实现此目标:

    func SomeFunc(parm string) int {
        result, _ := strconv.Atoi(param)
        return result
    }
    

    如果不引入一个接受两个参数并返回第一个参数的辅助函数,就没有单行解决方案。对于要忽略值的每种类型组合,都需要这些辅助函数之一。

    【讨论】:

      【解决方案2】:

      你最好的单行是一个辅助函数,写成:

      func first(n int, _ error) int {
          return n
      }
      
      func SomeFunc(param string) int {
          return first(strconv.Atoi(param))
      }
      

      请注意:

      • 参数类型和位置必须完全匹配
      • first 的第二个参数是blank identifier (_),表明您希望完全忽略它。 [1]

      如果你绝对不想声明一个命名函数,你可以使用函数字面量,但这看起来真的很难看:

      func SomeFunc(param string) int {
          return func(n int, _ error) int { return n }(strconv.Atoi(param))
      }
      

      一般来说,如果您的代码中有很多重复,那么辅助函数是值得的。否则只需使用一个临时变量,它看起来干净且惯用:

      func SomeFunc(param string) int {
          n, _ := strconv.Atoi(param)
          return n
      }
      

      游乐场:https://play.golang.org/p/X8EOh_JVDDG


      一旦将泛型添加到 Go 1.18 中的语言中,您将能够编写一个可用于任何返回对并在第一个返回对上保持类型安全的辅助函数:

      func first[T, U any](val T, _ U) T {
          return val
      }
      
      func SomeFunc(param string) int {
          return first(strconv.Atoi(param))
      }
      

      Go2 游乐场:https://go2goplay.golang.org/p/vLmTuwzrl5o


      脚注:

      [1] 请记住,在strings.Atoi 的情况下,第二个返回值是错误,忽略错误是不好的做法。但是有些情况下,操作成功与否真的无关紧要,那么可以使用_ 忽略参数。

      【讨论】:

        猜你喜欢
        • 2014-04-17
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多