为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在语句期间从函数(具有多个返回值)中获取单个值?

是否可以在语句期间从函数(具有多个返回值)中获取单个值?

Go
守着星空守着你 2022-08-24 11:13:53
例如,假设返回和和一个,我想将int返回值追加到字符串中。我知道如何在go中做到这一点的方法是:add(int, int)interrorfoo := "" bar, _ := add(1, 2) foo += strconv.Itoa(bar)但是,如果没有返回错误变量,我可以只做.add()foo += strconv.Itoa(add(1, 2))是否可以在语句期间忽略 error 变量来执行类似操作?
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

是否可以在语句期间忽略 error 变量来执行类似操作?

不,Go没有为这样的东西提供任何语言结构。

(但你可以有自己的必须...函数,如您将在包正则表达式或文本/模板中找到的函数。


查看完整回答
反对 回复 2022-08-24
?
慕容708150

TA贡献1831条经验 获得超4个赞

免责声明(我的观点):这个答案只是为了好玩。我不建议使用这个。忽略错误是不好的,试图压缩每一行代码都是愚蠢的。这只是说明了一些关于Go如何处理多个返回值的有趣概念,我在写这篇文章时学到了一些新东西,所以我想我会分享。


相关:这个问题更实际的表亲是“Must模式”,由一些标准库(包括模板)使用。它涉及获取值和错误,如果错误不是nil,则返回该值。请参阅此(当前冻结的)提案panic


您需要一个包装器函数来执行此操作。多个返回值将自动展开以填充参数。


请参阅此示例,它与add()


func ignoreError(i int, err error) int {

    return i

}

叫:


foo := ""

foo += strconv.Itoa(ignoreError(add(1, 2)))

下面是一个更通用的替代方法,它将从另一个函数中获取任意数量的值并返回第一个值。


func takeFirstValue(v ...interface{}) interface{} {

    if len(v) == 0 {

        return nil

    }

    return v[0]

}

叫:


    foo := ""

    foo += strconv.Itoa(takeFirstValue(add(1, 2)).(int))

此选项需要在调用站点进行强制转换以还原数据类型,因为 takeFirstValue 返回 。.(int)interface{}


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信