2017-08-21 10 views
-4

私はGoの可能性を探求したいと考えています。どのようにメソッドに「追加」するのでしょうか?単に:goに「メソッド」を追加する方法

type T interface{} 
type ST []interface{} 
func (st []T) app (t T) []T { 
    return(append(st, t)) 
} 

しかし、このコードでは、型の互換性をチェックしません: "st.app(T)==アペンド(ST、t)は、" これは私が得たものである

append([]int{1,2},"a") // correctly gives error 
ST{1,2}.app("a") // dumbly gives [1 2 a] !!! 

Iコードが型の互換性をチェックしない理由を知っていますが、それを行う正しい方法は何ですか?出来ますか? Goの仕組みを理解していただきありがとうございます。

+3

Goコードはジェネリックをサポートしていないため、ジェネリックで型保護された関数を書くことはできません。これは、 'append'がstdlibの一部ではなく組み込み関数として実装されている理由です。 – Adrian

答えて

2

これを行う正しい方法は、append()を組み込み関数として呼び出すことです。これは組み込み関数であるという事故ではありません。あなたはappendをGoに書くことはできません。それに近似するものは安全でない(そして複雑すぎる)でしょう。

移動しないでください。コード行を書くだけです。トリッキーなジェネリック医薬品の開発に費やした時間に、さらに3つの問題を解決して製品を出荷することができました。それがゴーの仕組みです。

これは、Goはジェネリックを持っていないが、我々はGo 2に向けて移動するとラス・コックスから次の点を考慮して決して言っているわけではない。

例えば、「私は最近、ジェネリックを検討してきたが、私はドンGoユーザが解決するためにジェネリックスを必要とする詳細で具体的な問題の明確な図が私の心の中にあります。その結果、ジェネリックメソッドをサポートするかどうか、つまり受信者とは別にパラメータ化されたメソッドをサポートするかどうかといった設計上の問題には答えられません。現実のユースケースが多ければ、重要な問題を調べることでこのような質問に答えることができます。

(一方、ジェネリック医薬品が最も応え-にされたトピックExperienceReportsで、それは誰も関心を認識していません。しかし、Goを戦わないということではありませんので。それは素晴らしいソフトウェアを出荷するための素晴らしい言語ですしかし、一般的な言語ではありません。)

+0

ありがとうございます。わかった。ジェネリック言語(Python、R、JS、..)で何年もコーディングした後、Goに慣れるのは難しいです。しかし、私はそのアイデアとシンプルさの大部分を好んでいます。 –

関連する問題