Saya terkejut saat mengetahui bahwa Go memiliki pernyataan 'goto' . Saya selalu diajari bahwa pernyataan 'goto' adalah sesuatu dari masa lalu dan kejahatan karena hal itu menghalangi aliran program yang sebenarnya, dan bahwa fungsi atau metode selalu merupakan cara yang lebih baik untuk mengendalikan aliran.
Saya pasti melewatkan sesuatu. Mengapa Google memasukkannya?
goto
berguna dalam kasus-kasus tertentu. Baca setelah mempelajari jawaban @ Kissaki.Jawaban:
Ketika kami benar-benar memeriksa kode sumber pustaka standar Go, kami dapat melihat di mana
goto
sebenarnya diterapkan dengan baik.Sebagai contoh, dalam
math/gamma.go
berkas, yanggoto
pernyataan digunakan :Dalam
goto
kasus ini, kita tidak perlu memasukkan variabel lain (boolean) yang digunakan hanya untuk aliran kontrol, diperiksa di bagian akhir. Dalam hal ini ,goto
pernyataan tersebut membuat kode sebenarnya lebih baik untuk dibaca dan lebih mudah diikuti (sangat bertentangan dengan argumen yang menentang yanggoto
Anda sebutkan).Perhatikan juga, bahwa
goto
pernyataan tersebut memiliki kasus penggunaan yang sangat spesifik. The spesifikasi bahasa di goto menyatakan bahwa hal itu mungkin tidak melompati variabel yang masuk ke lingkup (yang dinyatakan), dan mungkin tidak melompat ke blok lainnya (kode-).sumber
small(x,z)
untuk dipanggil saja? Dengan begitu kita tidak perlu memikirkan variabel apa saja yang bisa diakses dismall:
label. Saya menduga alasannya pergi masih kekurangan jenis dukungan sebaris tertentu di kompiler.goto
untuk menunjuk ke label setelah variabel baru dimasukkan. Menjalankan pernyataan "goto" tidak boleh menyebabkan variabel apa pun masuk ke cakupan yang belum ada dalam cakupan pada titik goto.Goto adalah ide yang bagus jika tidak ada fitur kontrol bawaan yang melakukan apa yang Anda inginkan, dan saat Anda dapat mengekspresikan apa yang Anda inginkan dengan goto. (Sayang sekali dalam kasus ini dalam beberapa bahasa ketika Anda tidak memiliki goto. Anda akhirnya menyalahgunakan beberapa fitur kontrol, menggunakan bendera boolean, atau menggunakan solusi lain yang lebih buruk daripada goto.)
Jika beberapa fitur kontrol lain (digunakan dengan cara yang cukup jelas) dapat melakukan apa yang Anda inginkan, Anda harus menggunakannya sebagai preferensi untuk pergi. Jika tidak, berani dan gunakan goto!
Terakhir, perlu dicatat bahwa Go's goto memiliki beberapa batasan yang dirancang untuk menghindari beberapa bug yang tidak jelas. Lihat batasan ini di spesifikasi.
sumber
Pernyataan Goto telah menerima banyak diskredit sejak era kode Spaghetti di tahun 60an dan 70an. Saat itu, metodologi pengembangan perangkat lunak sangat miskin atau bahkan tidak ada sama sekali. Namun Goto sebenarnya tidak jahat tetapi tentu saja dapat disalahgunakan dan disalahgunakan oleh pemrogram yang malas atau tidak terampil. Banyak masalah dengan Gotos yang disalahgunakan dapat diselesaikan dengan proses pengembangan seperti tinjauan kode tim.
goto
adalah lompatan dengan cara teknis yang sama seperticontinue
,break
danreturn
. Seseorang dapat berargumen bahwa ini adalah pernyataan jahat dengan cara yang sama tetapi sebenarnya tidak.Mengapa tim Go menyertakan Gotos mungkin karena fakta bahwa ini adalah kontrol aliran primitif yang umum. Selain itu, mereka berharap dapat menyimpulkan bahwa cakupan Go tidak termasuk membuat bahasa yang aman bagi orang bodoh tidak mungkin untuk disalahgunakan.
sumber
continue
,,break
danreturn
sangat berbeda dalam satu kunci khusus: mereka hanya menetapkan "keluar dari lingkup pelingkup". Mereka tidak hanya mendorong tetapi secara eksplisit mengharuskan pengembang mempertimbangkan struktur kode mereka dan mengandalkan primitif pemrograman terstruktur (untuk loop, fungsi, dan pernyataan sakelar). Satu-satunya anugrahgoto
pernyataan adalah bahwa mereka memungkinkan Anda menulis rakitan di HLL ketika pengoptimal kompiler tidak sesuai dengan tugasnya, tetapi ini datang dengan biaya keterbacaan dan pemeliharaan.setjmp
,longjmp
,goto
, dantry / except / finally
mereka memilih untuk err di samping hati-hati.goto
, fwict, adalah satu-satunya persetujuan untuk aliran kontrol pra- "pemrograman terstruktur".