ジェネリックデータ構造
ジェネリックなStackとSetを構築します。
「ジェネリックデータ構造」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
ジェネリックなデータ構造を使う理由
ジェネリクスが登場する前、Go開発者はinterface{}のスライス(型安全性が失われます)を使うか、型ごとにコードを生成していました。ジェネリクスにより、型安全で再利用可能なコンテナを作成できます。
ジェネリックなStack
ジェネリック型を使用した、型安全なスタックです。
type Stack[T any] struct{ items []T }
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items)==0 { var z T; return z, false }
n := len(s.items)-1; v := s.items[n]; s.items = s.items[:n]; return v, true
}
func (s *Stack[T]) Len() int { return len(s.items) }ジェネリックなQueue
スライスを内部で使用するFIFOキューです。
type Queue[T any] struct{ items []T }
func (q *Queue[T]) Enqueue(v T) { q.items = append(q.items, v) }
func (q *Queue[T]) Dequeue() (T, bool) {
if len(q.items)==0 { var z T; return z, false }
v := q.items[0]; q.items = q.items[1:]; return v, true
}ジェネリックなSet
マップを内部で使用するセットです。キーの型は比較可能でなければなりません。
type Set[T comparable] struct{ m map[T]struct{} }
func NewSet[T comparable]() *Set[T] { return &Set[T]{m: make(map[T]struct{})} }
func (s *Set[T]) Add(v T) { s.m[v] = struct{}{} }
func (s *Set[T]) Has(v T) bool { _, ok := s.m[v]; return ok }
func (s *Set[T]) Delete(v T) { delete(s.m, v) }ジェネリックなMapヘルパー
スライスに対して操作する、型安全な関数型Mapです。
func Map[T, U any](s []T, f func(T) U) []U {
out := make([]U, len(s))
for i, v := range s { out[i] = f(v) }
return out
}ジェネリックなFilter
述語を満たす要素だけを含む新しいスライスを返します。
func Filter[T any](s []T, predicate func(T) bool) []T {
var out []T
for _, v := range s {
if predicate(v) { out = append(out, v) }
}
return out
}ジェネリックなReduce
スライスを1つの値に畳み込みます。
func Reduce[T, U any](s []T, init U, f func(U, T) U) U {
acc := init
for _, v := range s { acc = f(acc, v) }
return acc
}OrderedMap
挿入順を保持する順序付きマップです。キーの順序が安定したJSONシリアライズに役立ちます。
type OrderedMap[K comparable, V any] struct {
keys []K
vals map[K]V
}ジェネリックな連結リスト
型安全な要素を扱う双方向連結リストです。
type Node[T any] struct{ Val T; Next, Prev *Node[T] }
type List[T any] struct{ head, tail *Node[T]; len int }制限事項
ジェネリック型では、Tに対する型switchを使用できません。ジェネリック型のメソッドで新しい型パラメーターを追加することもできません。特定のTに対してジェネリック型を特殊化することもできません(テンプレート特殊化はありません)。
パフォーマンス
Goのジェネリックなインスタンス化は「GC shape」によって行われます。つまり、メモリレイアウトが同じ型は1つの実装を共有します。これにより、具体的な実装に近いパフォーマンスを維持しながら、コードの肥大化を防ぎます。
ジェネリクスを使わない場合
インターフェースで十分な単純なケースや、具体的な型が1つか2つしかない場合は、ジェネリクスを避けてください。追加される複雑さがメリットを上回るためです。
クイックチェック
ジェネリックなSetでは、なぜ型パラメーターにcomparable制約が必要ですか。
まとめ:ジェネリックなデータ構造
重要なポイント:
- Stack、Queue、Setをジェネリクスで型安全に扱えます
- []Tに対する関数型ヘルパー:Map、Filter、Reduce
- マップを内部で使用するセットにはSet[T comparable]を使います
- メソッドレベルの型パラメーターやテンプレート特殊化はありません
よくある質問
「ジェネリックデータ構造」レッスンは無料ですか?
はい。「ジェネリックデータ構造」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「ジェネリックデータ構造」で何を学びますか?
ジェネリックなStackとSetを構築します。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ジェネリックデータ構造」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 型パラメーターの構文
- 制約:comparableとインターフェース
- ジェネリックデータ構造
- 実践ジェネリクス:注意点