Go dilinde işlev / yöntem aşırı yüklemesi var mı?


127

Bir C kütüphanesini Go'ya taşıyorum. AC işlevi (varargs ile) şu şekilde tanımlanır:

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

Bu yüzden sarmalayıcı C işlevleri oluşturdum:

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

Go'da işlevi şu şekilde tanımlarsam:

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)))
}

Go derleyicisi şikayet ediyor:

*Easy·SetOption redeclared in this block

Peki, Go işlevi (yöntem) aşırı yüklemeyi destekliyor mu, yoksa bu hata başka bir anlama mı geliyor?

Yanıtlar:


165

Hayır değil.

Bkz Git Dil SSS ve üzerinde Özellikle bölüm aşırı yüklenme .

Tür eşleştirmesi de yapması gerekmiyorsa yöntem gönderimi basitleştirilmiştir. Diğer dillerle edindiğimiz deneyimler bize, aynı isimde ancak farklı imzalara sahip çeşitli yöntemlere sahip olmanın bazen yararlı olduğunu, ancak pratikte kafa karıştırıcı ve kırılgan olabileceğini söyledi. Yalnızca isme göre eşleştirme ve türlerde tutarlılık gerektirme, Go'nun tür sisteminde önemli bir basitleştirici karardı.

Güncelleme: 2016-04-07

Go hala aşırı yüklenmiş işlevlere (ve muhtemelen asla sahip olmayacak) sahip olmasa da, aşırı yüklemenin en kullanışlı özelliği, isteğe bağlı bağımsız değişkenlerle bir işlevi çağırmak ve atlananlar için varsayılanları çıkarmak, o zamandan beri eklenen değişken bir işlev kullanılarak simüle edilebilir. Ancak bu, tür kontrolünün kaybına neden olur.

Örneğin: http://changelog.ca/log/2015/01/30/golang



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.