如何做一行程序,如果否则语句?

请参阅由@accdias 指出的 https://golangdocs.com/ternary-operator-in-golang(见注释)

我可以像在 php 中那样在 go (golang)中编写一个简单的 if-else 语句并赋值变量吗?例如:

$var = ( $a > $b )? $a: $b;

目前我必须使用以下方法:

var c int
if a > b {
c = a
} else {
c = b
}

对不起,我不能记住的名称,如果这个控制声明,我不能找到的信息网站或通过谷歌搜索。:/

251508 次浏览

正如评论中提到的,Go 不支持三进制一行。我能想到的最短形式是这样的:

var c int
if c = b; a > b {
c = a
}

但是请不要这样做,这样做不值得,而且只会让阅读代码的人感到困惑。

谢谢你指出正确答案。

我刚刚检查了 戈兰常见问题(duh) ,它明确指出,这是不可用的语言:

Go 有接线员吗?

围棋中没有三元格式。你可以使用以下方法得到相同的结果:

if expr {
n = trueVal
} else {
n = falseVal
}

附加信息发现,可能有兴趣的主题:

我经常使用以下方法:

c := b
if a > b {
c = a
}

基本上和@Not _ a _ Golfer 一样,只不过使用的是 类型推断类型推断

正如前面提到的,Go不支持三进制一行程序。但是,我编写了一个实用函数,它可以帮助您实现所需的目标。

// IfThenElse evaluates a condition, if true returns the first parameter otherwise the second
func IfThenElse(condition bool, a interface{}, b interface{}) interface{} {
if condition {
return a
}
return b
}

这里有一些测试用例来展示如何使用它

func TestIfThenElse(t *testing.T) {
assert.Equal(t, IfThenElse(1 == 1, "Yes", false), "Yes")
assert.Equal(t, IfThenElse(1 != 1, nil, 1), 1)
assert.Equal(t, IfThenElse(1 < 2, nil, "No"), nil)
}

为了好玩,我写了一些更有用的实用函数,比如:

IfThen(1 == 1, "Yes") // "Yes"
IfThen(1 != 1, "Woo") // nil
IfThen(1 < 2, "Less") // "Less"


IfThenElse(1 == 1, "Yes", false) // "Yes"
IfThenElse(1 != 1, nil, 1)       // 1
IfThenElse(1 < 2, nil, "No")     // nil


DefaultIfNil(nil, nil)  // nil
DefaultIfNil(nil, "")   // ""
DefaultIfNil("A", "B")  // "A"
DefaultIfNil(true, "B") // true
DefaultIfNil(1, false)  // 1


FirstNonNil(nil, nil)                // nil
FirstNonNil(nil, "")                 // ""
FirstNonNil("A", "B")                // "A"
FirstNonNil(true, "B")               // true
FirstNonNil(1, false)                // 1
FirstNonNil(nil, nil, nil, 10)       // 10
FirstNonNil(nil, nil, nil, nil, nil) // nil
FirstNonNil()                        // nil

如果您想使用其中的任何一个,您可以在这里找到它们 https://github.com/shomali11/util

这种语言中有一个非常类似的结构

**if <statement>; <evaluation> {
[statements ...]
} else {
[statements ...]
}*

*

也就是说。

if path,err := os.Executable(); err != nil {
log.Println(err)
} else {
log.Println(path)
}

一个可能的方法来做到这一点,在只有一行使用地图,简单地说,我正在检查是否 a > b如果它是 true我分配 ca否则 b

c := map[bool]int{true: a, false: b}[a > b]

然而,这看起来惊人,但在某些情况下,它可能不是完美的解决方案,因为评估顺序。例如,如果我正在检查一个对象是否不是 nil从中获得一些属性,请看下面的代码片段,在 myObj equals nil的情况下,它将是 panic

type MyStruct struct {
field1 string
field2 string
}


var myObj *MyStruct
myObj = nil


myField := map[bool]string{true: myObj.field1, false: "empty!"}[myObj != nil}

因为在评估条件之前,映射将首先被创建和构建,所以在 myObj = nil的情况下,这将是非常恐慌的。

不要忘记,你仍然可以在一个简单的行做条件,检查以下内容:

var c int
...
if a > b { c = a } else { c = b}

你可以使用一个闭包:

func doif(b bool, f1, f2 func()) {
switch{
case b:
f1()
case !b:
f2()
}
}


func dothis() { fmt.Println("Condition is true") }


func dothat() { fmt.Println("Condition is false") }


func main () {
condition := true
doif(condition, func() { dothis() }, func() { dothat() })
}

我对 Go 中的闭包语法唯一不满的地方是,缺省的 zero 参数 zero 返回函数没有别名,那样的话就更好了(想象一下,如何用类型名声明 map、 array 和 slice 文本)。

或者更简短的版本,正如一位评论者刚刚建议的那样:

func doif(b bool, f1, f2 func()) {
switch{
case b:
f1()
case !b:
f2()
}
}


func dothis() { fmt.Println("Condition is true") }


func dothat() { fmt.Println("Condition is false") }


func main () {
condition := true
doif(condition, dothis, dothat)
}

如果需要为函数提供参数,仍然需要使用闭包。在传递方法而不仅仅是函数的情况下可以避免这种情况,我认为函数中的参数是与方法相关联的结构。

有时,我尝试使用匿名函数来实现定义和赋值发生在同一行。如下:

a, b = 4, 8


c := func() int {
if a >b {
return a
}
return b
} ()

Https://play.golang.org/p/rmjqytmyeq0

使用 lambda 函数代替三元运算符

例子一

给出最大整数

package main


func main() {


println( func(a,b int) int {if a>b {return a} else {return b} }(1,2) )
}

例子2

假设您有这个 must(err error)函数来处理错误,并且希望在条件不满足时使用它。 (欢迎收看 https://play.golang.com/p/COXyo0qIslP)

package main


import (
"errors"
"log"
"os"
)


// must is a little helper to handle errors. If passed error != nil, it simply panics.
func must(err error) {
if err != nil {
log.Println(err)
panic(err)
}
}


func main() {


tmpDir := os.TempDir()
// Make sure os.TempDir didn't return empty string
// reusing my favourite `must` helper
// Isn't that kinda creepy now though?
must(func() error {
var err error
if len(tmpDir) > 0 {
err = nil
} else {
err = errors.New("os.TempDir is empty")
}
return err
}()) // Don't forget that empty parentheses to invoke the lambda.
println("We happy with", tmpDir)
}

正如 user2680100所说,在 Golang,你可以拥有这样的结构:

if <statement>; <evaluation> {
[statements ...]
} else {
[statements ...]
}

这对于一些需要错误检查的表达式或另一种布尔检查非常有用,比如:


var number int64
if v := os.Getenv("NUMBER"); v != "" {
if number, err = strconv.ParseInt(v, 10, 64); err != nil {
os.Exit(42)
}
} else {
os.Exit(1)
}

这样你就可以得到类似(在 C 语言中)的东西:

Sprite *buffer = get_sprite("foo.png");
Sprite *foo_sprite = (buffer != 0) ? buffer : donut_sprite

但是很明显,在 Golang,这种糖必须适量使用,对我个人来说,我喜欢使用这种最大一级筑巢的糖,比如:


var number int64
if v := os.Getenv("NUMBER"); v != "" {
number, err = strconv.ParseInt(v, 10, 64)
if err != nil {
os.Exit(42)
}
} else {
os.Exit(1)
}

你也可以用像 func Ternary(b bool, a interface{}, b interface{}) { ... } 这样的函数来实现三元表达式,但是我不喜欢这种方法,看起来像是在语法上创建了一个异常情况,并且创建了这些“特性”,在我个人看来,减少了对算法和可读性的关注,但是,最重要的是,让我不要用这种方法的事实是,这会带来一种开销,并且在你的程序执行中带来更多的循环。

三元? 运算符替代 | 戈兰,如果否则一行 你不能用围棋语言写一个简短的条件句,因为没有条件运算符。 了解更多关于如果. . Golang 的其他

正如其他人所指出的,围棋中没有三元操作符。

但是,对于您的特定示例,如果希望使用单行程序,则可以使用 Max

import "math"


...


c := math.Max(a, b)