Önsöz: Bunu tartışmadanif else
yolun , dil etkin yapılarda hala oynayabilir ve zevk bulabiliriz.
Aşağıdaki If
yapı, github.com/icza/gox
kütüphanemde tür olan birçok başka yöntemle kullanılabilir builtinx.If
.
Go, ilkel türler de dahil olmak üzere kullanıcı tanımlı türlere yöntem eklenmesine izin verir bool
. Biz sahip özel bir türü oluşturabilir bool
onun kadar altta yatan tip ve sonra basit bir tip olan dönüşüm şartıyla, biz onun yöntemlerine erişim hakkına sahiptir. İşlenenlerden alma ve seçim yöntemleri.
Bunun gibi bir şey:
type If bool
func (c If) Int(a, b int) int {
if c {
return a
}
return b
}
Nasıl Kullanabiliriz?
i := If(condition).Int(val1, val2) // Short variable declaration, i is of type int
|-----------| \
type conversion \---method call
Örneğin bir üçlü max()
:
i := If(a > b).Int(a, b)
Üçlü abs()
:
i := If(a >= 0).Int(a, -a)
Bu harika görünüyor, basit, zarif ve verimli (aynı zamanda satır içi için de uygun ).
"Gerçek" üçlü operatörle karşılaştırıldığında bir dezavantaj: her zaman tüm işlenenleri değerlendirir.
Ertelenmiş ve yalnızca gerekirse değerlendirme yapmak için tek seçenek, yalnızca gerektiğinde / gerekirse çağrılan işlevleri ( bildirilen işlevler veya yöntemler veya işlev değişmezleri ) kullanmaktır:
func (c If) Fint(fa, fb func() int) int {
if c {
return fa()
}
return fb()
}
Kullanmak: Diyelim ki hesaplamak için bu fonksiyonlara sahibiz a
ve b
:
func calca() int { return 3 }
func calcb() int { return 4 }
Sonra:
i := If(someCondition).Fint(calca, calcb)
Örneğin, mevcut yıl> 2020 olan koşul:
i := If(time.Now().Year() > 2020).Fint(calca, calcb)
İşlev değişmezlerini kullanmak istiyorsak:
i := If(time.Now().Year() > 2020).Fint(
func() int { return 3 },
func() int { return 4 },
)
Son not: Farklı imzalara sahip işlevleriniz varsa, burada kullanamazsınız. Bu durumda, hala uygulanabilir hale getirmek için eşleşen imzalı bir işlev değişmezi kullanabilirsiniz.
Örneğin , parametrelerde de calca()
ve varsa calcb()
(dönüş değerinin yanı sıra):
func calca2(x int) int { return 3 }
func calcb2(x int) int { return 4 }
Bunları şu şekilde kullanabilirsiniz:
i := If(time.Now().Year() > 2020).Fint(
func() int { return calca2(0) },
func() int { return calcb2(0) },
)
Go Playground'da bu örnekleri deneyin .