web-dev-qa-db-ja.com

ワンライナーif elseステートメントの実行方法

Phpの場合と同様に、go(golang)で変数を割り当てた簡単なif-elseステートメントを記述できますか(たとえば)。

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

現在、以下を使用する必要があります。

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

申し訳ありませんが、この制御ステートメントと、サイト内およびGoogle検索で情報を見つけることができなかった場合、名前を思い出せません。 :/

65
thoroc

言及されているように、Goはternary one linersをサポートしていません。私が考えることができる最も短い形式はこれです:

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

私は頻繁に次を使用します:

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

基本的に@Not_a_Golferと同じですが、 type inference を使用します。

24
xoyuz

他の人が述べたように、Goは3項ワンライナーをサポートしません。しかし、私はあなたが望むものを達成するのに役立つユーティリティ関数を書きました。

// 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

16
Raed Shomali

正解を指摘していただきありがとうございます。

Golang FAQ (duh)を確認したところ、この言語では利用できないことが明確に述べられています:

Goには?:演算子がありますか?

Goには三項形式はありません。以下を使用して同じ結果を得ることができます。

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

主題に興味があるかもしれない追加情報が見つかりました

11
thoroc

時々、匿名関数を使用して、定義と割り当てを同じ行で実行しようとします。以下のように:

a, b = 4, 8

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

https://play.golang.org/p/rMjqytMYeQ

1
Ron

非常によく似た構造が言語で利用可能です

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

*

つまり.

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

これにはクロージャーを使用できます。

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のクロージャー構文に私が持っている唯一の不満は、デフォルトのゼロパラメーターゼロリターン関数のエイリアスがないことです。それははるかに良いでしょう(タイプ名だけでマップ、配列、スライスリテラルを宣言する方法のように考えてください)。

あるいは、コメンターが示唆したように、短いバージョンでも:

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)
}

関数にパラメーターを指定する必要がある場合は、クロージャーを使用する必要があります。これは、パラメータがメソッドに関連付けられた構造体であると思う、単なる関数ではなくメソッドを渡す場合に不要になる可能性があります。

0
Louki Sumirniy