1. ホーム
  2. go

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

2022-04-25 17:30:38

質問

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

どうすればいい?

いいえ、そうではありません。

をご覧ください。 Go言語FAQ のセクションをご覧ください。 オーバーロード .

メソッドディスパッチは、タイプマッチングも必要なければ、簡素化される。他の言語での経験から、同じ名前で異なるシグネチャを持つ様々なメソッドを持つことは、時には便利ですが、実際には混乱しやすく壊れやすいということがわかりました。名前だけでマッチングし、型に一貫性を持たせることは、Goの型システムにおける主要な単純化の決定でした。

更新日:2016-04-07

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

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