Go言語には関数/メソッドのオーバーロードがありますか?


127

CライブラリをGoに移植しています。C関数(varargs付き)は次のように定義されます。

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

そこで、ラッパーC関数を作成しました。

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

Goで関数を次のように定義すると、

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コンパイラーは文句を言います:

*Easy·SetOption redeclared in this block

Goは関数(メソッド)のオーバーロードをサポートしていますか、それともこのエラーは別の意味ですか?

回答:


165

いいえ、違います。

Go言語に関するFAQ、特にオーバーロードに関するセクションを参照してください。

タイプマッチングも必要としない場合、メソッドディスパッチは簡略化されます。他の言語の経験から、同じ名前でシグネチャが異なるさまざまなメソッドを使用すると便利な場合がありますが、実際には混乱しやすく、壊れやすいこともあります。名前のみで照合し、型の一貫性を要求することは、Goの型システムでの大幅な簡素化の決定でした。

更新:2016-04-07

Goにはまだオーバーロードされた関数がありません(おそらくないでしょう)が、オーバーロードの最も便利な機能であるオプションの引数を使用して関数を呼び出し、省略された関数のデフォルトを推測する機能は、可変長関数を使用してシミュレートできます。しかし、これは型チェックを失うことになります。

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.