Phpの場合と同様に、go(golang)で変数を割り当てた簡単なif-elseステートメントを記述できますか(たとえば)。
$var = ( $a > $b )? $a: $b;
現在、以下を使用する必要があります。
var c int
if a > b {
c = a
} else {
c = b
}
申し訳ありませんが、この制御ステートメントと、サイト内およびGoogle検索で情報を見つけることができなかった場合、名前を思い出せません。 :/
言及されているように、Goはternary one linersをサポートしていません。私が考えることができる最も短い形式はこれです:
var c int
if c = b; a > b {
c = a
}
他の人が述べたように、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
正解を指摘していただきありがとうございます。
Golang FAQ (duh)を確認したところ、この言語では利用できないことが明確に述べられています:
Goには?:演算子がありますか?
Goには三項形式はありません。以下を使用して同じ結果を得ることができます。
if expr { n = trueVal } else { n = falseVal }
主題に興味があるかもしれない追加情報が見つかりました
時々、匿名関数を使用して、定義と割り当てを同じ行で実行しようとします。以下のように:
a, b = 4, 8
c := func() int {
if a >b {
return a
}
return b
} ()
非常によく似た構造が言語で利用可能です
**if <statement>; <evaluation> {
[statements ...]
} else {
[statements ...]
}*
*
つまり.
if path,err := os.Executable(); err != nil {
log.Println(err)
} else {
log.Println(path)
}
これにはクロージャーを使用できます。
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)
}
関数にパラメーターを指定する必要がある場合は、クロージャーを使用する必要があります。これは、パラメータがメソッドに関連付けられた構造体であると思う、単なる関数ではなくメソッドを渡す場合に不要になる可能性があります。