Dapatkah saya menulis pernyataan if-else sederhana dengan tugas variabel di go (golang) seperti yang akan saya lakukan di php? Sebagai contoh:
$var = ( $a > $b )? $a: $b;
Saat ini saya harus menggunakan yang berikut ini:
var c int
if a > b {
c = a
} else {
c = b
}
Maaf, saya tidak dapat mengingat nama jika pernyataan kontrol ini dan saya tidak dapat menemukan info di situs atau melalui pencarian google. : /
if-statement
go
conditional-operator
ternary
thoroc.dll
sumber
sumber
Jawaban:
Seperti yang disebutkan di komentar, Go tidak mendukung terner one liners. Bentuk terpendek yang dapat saya pikirkan adalah ini:
Tapi tolong jangan lakukan itu, itu tidak sepadan dan hanya akan membingungkan orang yang membaca kode Anda.
sumber
Saya sering menggunakan yang berikut ini:
pada dasarnya sama dengan @ Not_a_Golfer tetapi menggunakan inferensi tipe .
sumber
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
kecepatan yang sama seperti terner untuk produksi, dan keterbacaan yang cukup baik.Seperti yang disebutkan orang lain,
Go
tidak mendukung terner satu baris. Namun, saya menulis fungsi utilitas yang dapat membantu Anda mencapai apa yang Anda inginkan.Berikut beberapa kasus uji untuk menunjukkan bagaimana Anda dapat menggunakannya
Untuk bersenang-senang, saya menulis fungsi utilitas yang lebih berguna seperti:
Jika Anda ingin menggunakan semua ini, Anda dapat menemukannya di sini https://github.com/shomali11/util
sumber
Terima kasih telah menunjuk ke jawaban yang benar.
Saya baru saja memeriksa FAQ Golang (ya) dan dengan jelas menyatakan, ini tidak tersedia dalam bahasa:
info tambahan ditemukan yang mungkin menarik tentang subjek:
sumber
var c int; if a > b { c = a } else { c = b }
:? Tapi saya sarankan menyimpannya dalam 5 baris untuk membentuk blok cahaya untuk rekreasi pembaca;)Salah satu cara yang mungkin untuk melakukan hal ini hanya dalam satu baris dengan menggunakan peta, sederhana saya memeriksa apakah
a > b
jikatrue
saya menugaskanc
untuka
sebaliknyab
Namun, ini tampak luar biasa tetapi dalam beberapa kasus mungkin BUKAN menjadi solusi yang tepat karena urutan evaluasi. Misalnya, jika saya memeriksa apakah suatu objek tidak
nil
mendapatkan beberapa properti darinya, lihat cuplikan kode berikut yang akanpanic
terjadimyObj equals nil
Karena peta akan dibuat dan dibangun terlebih dahulu sebelum mengevaluasi kondisinya begitu jika terjadi
myObj = nil
ini akan panik.Selain itu, Anda tetap dapat melakukan ketentuan hanya dalam satu baris sederhana, periksa berikut ini:
sumber
Gunakan fungsi lambda sebagai ganti operator terner
Contoh 1
untuk memberikan int maks
Contoh 2
Misalkan Anda memiliki
must(err error)
fungsi ini untuk menangani kesalahan dan Anda ingin menggunakannya ketika kondisi tidak terpenuhi. (nikmati di https://play.golang.com/p/COXyo0qIslP )sumber
Terkadang, saya mencoba menggunakan fungsi anonim untuk mencapai pendefinisian dan penetapan terjadi pada baris yang sama. seperti dibawah ini:
https://play.golang.org/p/rMjqytMYeQ0
sumber
Konstruksi yang sangat mirip tersedia dalam bahasa tersebut
*
yaitu
sumber
Anda dapat menggunakan closure untuk ini:
Satu-satunya keluhan yang saya miliki dengan sintaks penutupan di Go adalah tidak ada alias untuk fungsi nol parameter nol default kembali, maka itu akan jauh lebih baik (pikirkan seperti bagaimana Anda mendeklarasikan peta, array dan irisan literal hanya dengan nama tipe).
Atau bahkan versi yang lebih pendek, seperti yang baru saja disarankan oleh pemberi komentar:
Anda masih perlu menggunakan closure jika Anda perlu memberikan parameter pada fungsi. Ini bisa dihindari dalam kasus metode yang lewat daripada hanya fungsi yang saya pikir, di mana parameter adalah struct yang terkait dengan metode.
sumber
doif(condition, dothis, dothat)