首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是相当于C的三元运算符的惯用Go?

什么是相当于C的三元运算符的惯用Go?
EN

Stack Overflow用户
提问于 2013-11-14 21:39:09
回答 6查看 296.8K关注 0票数 424

在C/C++ (以及该系列中的许多语言)中,根据条件声明和初始化变量的常见习惯用法是使用三元条件运算符:

代码语言:javascript
复制
int index = val > 0 ? val : -val

Go没有条件运算符。实现上述相同代码的最常用的方式是什么?我得到了以下解决方案,但它似乎相当冗长

代码语言:javascript
复制
var index int

if val > 0 {
    index = val
} else {
    index = -val
}

有没有更好的东西?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-11-14 22:08:48

正如所指出的(希望并不令人惊讶),使用if+else确实是在Go中执行条件句的idiomatic way

但是,除了完整的var+if+else代码块之外,这种拼写也经常使用:

代码语言:javascript
复制
index := val
if val <= 0 {
    index = -val
}

如果你有一个足够重复的代码块,比如int value = a <= b ? a : b的等价物,你可以创建一个函数来保存它:

代码语言:javascript
复制
func min(a, b int) int {
    if a <= b {
        return a
    }
    return b
}

...

value := min(a, b)

编译器将内联这些简单的函数,因此它更快、更清晰、更简短。

票数 356
EN

Stack Overflow用户

发布于 2016-01-06 23:18:49

假设您有以下三元表达式(用C编写):

代码语言:javascript
复制
int a = test ? 1 : 2;

Go中惯用的方法是简单地使用if块:

代码语言:javascript
复制
var a int

if test {
  a = 1
} else {
  a = 2
}

但是,这可能不符合您的要求。在我的例子中,我需要一个代码生成模板的内联表达式。

我使用了一个立即求值的匿名函数:

代码语言:javascript
复制
a := func() int { if test { return 1 } else { return 2 } }()

这可以确保两个分支都不会同时被评估。

票数 71
EN

Stack Overflow用户

发布于 2015-07-18 03:57:53

不带括号的map三元很容易阅读:

代码语言:javascript
复制
c := map[bool]int{true: 1, false: 0} [5 > 4]
票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19979178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档