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

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

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

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 は関数 (メソッド) のオーバーロードをサポートしていますか、それともこのエラーは何か他の意味があるのでしょうか?

ベストアンサー1

いいえ、違います。

を参照してくださいGo言語に関するよくある質問、特に過負荷

メソッドのディスパッチは、型マッチングも行う必要がない場合は簡素化されます。他の言語での経験から、名前は同じだがシグネチャが異なるさまざまなメソッドを持つことは、時には便利ですが、実際には混乱を招き、脆弱になる可能性があることがわかりました。名前のみでマッチングし、型の一貫性を要求することは、Go の型システムにおける主要な簡素化の決定でした。

更新日: 2016-04-07

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

おすすめ記事