If statement 如何做一行if-else语句?

If statement 如何做一行if-else语句?,if-statement,go,conditional-operator,ternary,If Statement,Go,Conditional Operator,Ternary,我可以像在php中那样,在go(golang)中编写一个简单的if-else语句,并使用变量赋值吗?例如: $var = ( $a > $b )? $a: $b; 目前,我必须使用以下工具: var c int if a > b { c = a } else { c = b } c := b if a > b { c = a } 很抱歉,如果此控制语句和我无法在站点或通过谷歌搜索找到信息,我将记不起名称:/ 正如前面提到的,Go不支持三元一行程序。

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

$var = ( $a > $b )? $a: $b;
目前,我必须使用以下工具:

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

很抱歉,如果此控制语句和我无法在站点或通过谷歌搜索找到信息,我将记不起名称:/

正如前面提到的,Go不支持三元一行程序。我能想到的最短形式是:

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

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

谢谢您指出正确答案

我刚刚检查了(duh),它清楚地表明,这在语言中不可用:

Go有接线员吗

Go中没有三元形式。您可以使用以下方法获得相同的结果:

if expr {
    n = trueVal
} else {
    n = falseVal
}
发现可能对该主题感兴趣的其他信息:


我经常使用以下方法:

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

基本上与@Not_a_Golfer's相同,但使用。

如其他人所述,
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)
}
func TestIfThenElse(t*testing.t){
assert.Equal(t,IfThenElse(1==1,“是”,false),“是”)
assert.Equal(t,IfThenElse(1!=1,nil,1),1)
断言相等(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
IfThen(1==1,“是”)/“是”
如果(1!=1,“Woo”)//nil
如果(1<2,“较少”)/“较少”
如果其他(1==1,“是”,则为假)/“是”
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,“”/“”)
第一非零(“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

如果您想使用其中任何一种,可以在此处找到它们

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

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

一种可能的方法是使用映射在一行中实现这一点,很简单,我正在检查
a>b
是否为
true
我正在将
c
分配给
a
否则
b

c := map[bool]int{true: a, false: b}[a > b]
然而,这看起来令人惊讶,但在某些情况下,由于评估顺序,它可能不是完美的解决方案。例如,如果我正在检查一个对象是否不是
nil
从中获取一些属性,请查看以下代码片段,如果
myObj等于nil

type MyStruct struct {
   field1 string
   field2 string 
}

var myObj *MyStruct
myObj = nil 

myField := map[bool]string{true: myObj.field1, false: "empty!"}[myObj != nil}
因为map将在评估条件之前首先创建和构建,所以在出现
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中的闭包语法,我唯一的不满是默认的零参数零返回函数没有别名,那么它会更好(想象一下如何用一个类型名声明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
  } ()

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

示例1

给出最大整数

主程序包
func main(){
println(func(a,b int)int{if a>b{returna}else{returnb}}(1,2))
}
示例2

假设您有这个
must(err error)
函数来处理错误,并且希望在条件未满足时使用它。 (在享受)

主程序包
进口(
“错误”
“日志”
“操作系统”
)
//必须是处理错误的小助手。如果通过错误!=零,它只是恐慌。
func必须(错误){
如果错误!=零{
log.Println(错误)
恐慌(错误)
}
}
func main(){
tmpDir:=os.TempDir()
//确保os.TempDir没有返回空字符串
//重复使用我最喜欢的“必须”助手
//现在这不是有点令人毛骨悚然吗?
must(func()错误{
变量错误
如果len(tmpDir)>0{
错误=零
}否则{
err=errors.New(“os.TempDir为空”)
}
返回错误
}())//不要忘记调用lambda的空括号。
println(“我们很满意”,tmpDir)
}

正如user2680100所说,在Golang中,您可以拥有以下结构:

if <statement>; <evaluation> {
    [statements ...]
} else {
    [statements ...]
}
通过这种方式,您可以实现(在C中):

Sprite*buffer=get_Sprite(“foo.png”);
精灵*foo_精灵=(缓冲区!=0)?缓冲区:甜甜圈雪碧
但很明显,Golang的这种糖必须适度使用,对我个人来说,我喜欢在最大一级筑巢时使用这种糖,比如:


变量号int64
如果v:=os.Getenv(“编号”);v!="" {
数字,err=strconv.ParseInt(v,10,64)
如果错误!=零{
操作系统出口(42)
}
}否则{
操作系统退出(1)
}
你也可以用函数来实现三元表达式,比如
func-trinal(b bool,a interface{},b interface{}{…}
,但我不喜欢这种方法,看起来像是在语法上创建了一个例外情况,而在我个人看来,创建这个“特性”会减少对这个问题的关注,也就是说