あいまいなタイトルで申し訳ありません。
私はこの本http://algs4.cs.princeton.edu/home/を読んでいて、学習演習として Go で例を実装するのが良いと思いましたが、この本ではコードを記述する言語として Java を使用しています。 .
最初の章の 1 つで、後で再利用するためのいくつかのコア データ型/コンテナ スタイル クラスの設定について説明していますが、主にこれらのデータ型が Java ジェネリックの使用を楽しんでいるように見えるため、これらを Go 設定に組み込むのに苦労しています。
たとえば、私は次のコードを書きました
package bag
type T interface{}
type Bag []T
func (a *Bag) Add(t T) {
*a = append(*a, t)
}
func (a *Bag) IsEmpty() bool {
return len(*a) == 0
}
func (a *Bag) Size() int {
return len(*a)
}
Bag
これは、アイテムを に追加し、そのサイズとすべてを確認できるという意味で、原則として機能します。ただし、これは次のコードが有効であることも意味します
a := make(bag.Bag,0,0)
a.Add(1)
a.Add("Hello world!")
a.Add(5.6)
a.Add(time.Now())
タイプを強制して、次のような契約に準拠する方法があるかどうか疑問に思っていました
Bag<T> bagOfMyType = new Bag<T>()
例えば
Bag<Integer> bagOfInts = new Bag<Integer>()
Goにはジェネリックがなく、実際にはGo Wayではないことは知っていますが、コンパイル時に何かを「強制」できるかどうか疑問に思っていました(おそらくそうではありません)
長文すみません
編集:わかりましたので、これをもう少し詳しく調べてきました。ジェネリック側のことはほとんどあきらめました (これは Go のロードマップにないことを理解しています)。インターフェイスを持つ Haskell 型クラス。
type T interface{}
type Bag interface {
Add(t T)
IsEmpty() bool
Size() int
}
type IntSlice []int
func (i *IntSlice) Add(t T) {
*i = append(*i, t.(int)) // will throw runtime exception if user attempts to add anything other than int
}
func (i *IntSlice) IsEmpty() bool {
return len(*i) == 0
}
func (i *IntSlice) Size() int {
return len(*i)
}
これに関する問題は、型の強制が実行時にのみ強制されることです。
これを改善する方法はありますか?