Bisakah Go memiliki parameter opsional? Atau bisakah saya mendefinisikan dua fungsi dengan nama yang sama dan jumlah argumen yang berbeda?
go
overloading
devyn
sumber
sumber
Jawaban:
Go tidak memiliki parameter opsional dan juga tidak mendukung metode overloading :
sumber
make
ada kasus khusus? Atau bahkan tidak benar-benar diimplementasikan sebagai fungsi ...make
adalah konstruksi bahasa dan aturan yang disebutkan di atas tidak berlaku. Lihat pertanyaan terkait ini .range
adalah kasus yang sama denganmake
, dalam artiCara yang bagus untuk mencapai sesuatu seperti parameter opsional adalah dengan menggunakan args variadic. Fungsi sebenarnya menerima sepotong tipe apa pun yang Anda tentukan.
sumber
params
adalah sepotong intAnda dapat menggunakan struct yang mencakup parameter:
sumber
Untuk parameter opsional yang sewenang-wenang dan berpotensi besar, idiom yang bagus adalah menggunakan opsi Fungsional .
Untuk tipe Anda
Foobar
, tulis pertama hanya satu konstruktor:di mana setiap opsi adalah fungsi yang mengubah Foobar. Kemudian berikan cara mudah bagi pengguna Anda untuk menggunakan atau membuat opsi standar, misalnya:
Tempat bermain
Untuk keringkasan, Anda dapat memberi nama dengan jenis opsi ( Taman Bermain ):
Jika Anda membutuhkan parameter wajib, tambahkan sebagai argumen pertama konstruktor sebelum variadic
options
.Manfaat utama dari idiom opsi Fungsional adalah:
Teknik ini diciptakan oleh Rob Pike dan juga didemonstrasikan oleh Dave Cheney .
sumber
func()
jika perlu, daripada itu menekuk otak saya di sekitar pendekatan ini. Setiap kali saya harus menggunakan pendekatan ini, seperti dengan perpustakaan Echo, saya menemukan otak saya terjebak dalam lubang kelinci abstraksi. #fwiwParameter opsional atau kelebihan fungsi tidak didukung di Go. Go memang mendukung sejumlah variabel parameter: Melewati argumen ke ... parameter
sumber
Tidak - tidak juga. Per the Go for C ++ programmer programmer ,
Saya tidak dapat menemukan pernyataan yang sama jelasnya bahwa parameter opsional tidak didukung, tetapi mereka juga tidak didukung.
sumber
Anda dapat merangkum ini dengan sangat baik dalam fungsi yang mirip dengan apa yang ada di bawah ini.
Dalam contoh ini, prompt secara default memiliki titik dua dan spasi di depannya. . .
. . . namun Anda dapat menimpanya dengan menyediakan parameter ke fungsi prompt.
Ini akan menghasilkan prompt seperti di bawah ini.
sumber
Saya akhirnya menggunakan kombinasi struktur params dan variadic args. Dengan cara ini, saya tidak perlu mengubah antarmuka yang ada yang dikonsumsi oleh beberapa layanan dan layanan saya dapat melewati params tambahan sesuai kebutuhan. Contoh kode di taman bermain golang: https://play.golang.org/p/G668FA97Nu
sumber
Bahasa Go tidak mendukung metode overloading, tetapi Anda dapat menggunakan argumen variadik seperti parameter opsional, juga Anda dapat menggunakan antarmuka {} sebagai parameter tetapi itu bukan pilihan yang baik.
sumber
Saya sedikit terlambat, tetapi jika Anda menyukai antarmuka yang lancar, Anda dapat mendesain setter Anda untuk panggilan berantai seperti ini:
Dan menyebutnya seperti ini:
Ini mirip dengan idiom opsi Fungsional yang disajikan pada jawaban @Rounet dan menikmati manfaat yang sama tetapi memiliki beberapa kelemahan:
err
variabel dan mem-nolkannya.Namun, ada sedikit kemungkinan keuntungan, pemanggilan fungsi jenis ini seharusnya lebih mudah bagi kompiler untuk inline tetapi saya benar-benar bukan spesialis.
sumber
Anda dapat melewati parameter bernama acak dengan peta.
sumber
Kemungkinan lain adalah menggunakan struct yang dengan bidang untuk menunjukkan apakah valid. Tipe null dari sql seperti NullString nyaman. Sangat menyenangkan tidak harus mendefinisikan tipe Anda sendiri, tetapi jika Anda membutuhkan tipe data khusus, Anda selalu dapat mengikuti pola yang sama. Saya pikir opsional-ness jelas dari definisi fungsi dan ada kode atau usaha ekstra minimal.
Sebagai contoh:
sumber