構造体とインターフェース
Go Generics
Write one function or type that works with many types using type parameters.
学べること
- Type parameters
- Constraints
- Generic types
Sum[T Number]
Sum([]int{1, 2, 3})6Sum([]float64{1.5, 2.5})4One definition, many types
Generics let you write code once and use it with different types. A type parameter such as T, written in square brackets, stands for a type that is chosen where the code is used.
Number is a constraint: Sum accepts any type built on int or float64. Map has two type parameters, so it can turn a slice of one type into a slice of another. Stack[T] is a generic type, and Stack[string] is a stack of strings.
重要なポイント
- [T Number] limits T to numbers.
- any allows every type.
Stack[string]is a stack of strings.
実行できる Go のサンプル
Go
main.go
package main
import (
"fmt"
"strings"
)
type Number interface {
~int | ~float64
}
func Sum[T Number](values []T) T {
var total T
for _, value := range values {
total += value
}
return total
}
func Map[T, U any](items []T, convert func(T) U) []U {
result := make([]U, 0, len(items))
for _, item := range items {
result = append(result, convert(item))
}
return result
}
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(item T) { s.items = append(s.items, item) }
func (s *Stack[T]) Pop() (T, bool) {
var zero T
if len(s.items) == 0 {
return zero, false
}
last := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return last, true
}
func main() {
fmt.Println(Sum([]int{1, 2, 3}), Sum([]float64{1.5, 2.5}))
fmt.Println(Map([]int{1, 2, 3}, func(n int) string { return strings.Repeat("*", n) }))
stack := &Stack[string]{}
stack.Push("a")
stack.Push("b")
top, _ := stack.Pop()
fmt.Println(top, len(stack.items))
}
6 4
[* ** ***]
b 1練習
サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。
このレッスンを終えましたか?
学習済みにすると進み具合を記録できます。
進み具合はこのブラウザーに保存されています ログインすると、どのデバイスでも引き継げます。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
すべてのチャレンジ