Apakah bahasa Go memiliki kelebihan fungsi / metode?

127

Saya memindahkan pustaka C ke Go. Fungsi AC (dengan varargs) didefinisikan seperti ini:

curl_easy_setopt(CURL *curl, CURLoption option, ...); 

Jadi saya membuat fungsi pembungkus C:

curl_wrapper_easy_setopt_str(CURL *curl, CURLoption option, char* param);
curl_wrapper_easy_setopt_long(CURL *curl, CURLoption option, long param);

Jika saya mendefinisikan fungsi di Go seperti ini:

func (e *Easy)SetOption(option Option, param string) {
    e.code = Code(C.curl_wrapper_easy_setopt_str(e.curl, C.CURLoption(option), C.CString(param)))
}

func (e *Easy)SetOption(option Option, param long) {
    e.code = Code(C.curl_wrapper_easy_setopt_long(e.curl, C.CURLoption(option), C.long(param)))
}

Kompiler Go mengeluh:

*Easy·SetOption redeclared in this block

Jadi apakah Go mendukung fungsi (metode) kelebihan beban, atau apakah kesalahan ini berarti sesuatu yang lain?

Darius Kucinskas
sumber

Jawaban:

165

Tidak.

Lihat FAQ Go Language , dan khususnya bagian tentang overloading .

Pengiriman metode disederhanakan jika tidak perlu melakukan pencocokan jenis juga. Pengalaman dengan bahasa lain memberi tahu kami bahwa memiliki berbagai metode dengan nama yang sama tetapi tanda tangan yang berbeda terkadang berguna tetapi juga bisa membingungkan dan rapuh dalam praktiknya. Mencocokkan hanya dengan nama dan membutuhkan konsistensi dalam tipe adalah keputusan penyederhanaan utama dalam sistem tipe Go.

Perbarui: 2016-04-07

Meskipun Go masih tidak memiliki fungsi yang kelebihan beban (dan mungkin tidak akan pernah), fitur yang paling berguna dari beban berlebih, yaitu memanggil fungsi dengan argumen opsional dan menyimpulkan default untuk fungsi yang dihilangkan dapat disimulasikan menggunakan fungsi variadic, yang telah ditambahkan sejak saat itu. Tapi ini terjadi karena hilangnya pengecekan tipe.

Misalnya: http://changelog.ca/log/2015/01/30/golang

Lawrence Dol
sumber
20

Menurut ini, tidak: http://golang.org/doc/go_for_cpp_programmers.html

Di bagian Perbedaan Konseptual , dikatakan:

"Go tidak mendukung overloading fungsi dan tidak mendukung operator yang ditentukan pengguna."

Merigrim
sumber