Golang Generics Interface: 実践的なコード例で理解しよう

こんにちは、今回はGolangのGenericsとInterfaceに焦点を当てて、実用的なコード例を交えて解説していきます。GenericsとInterfaceはGolangの強力な機能であり、それぞれの特性を理解することは、より効果的なコードの記述に役立ちます。それでは、始めましょう。

Genericsとは何か?

Genericsは、異なるデータ型に対して共通のアルゴリズムやデータ構造を使用するための仕組みです。これにより、コードの再利用性が向上し、型安全性が保たれます。

以下は、Genericsを使用した単純なスライスのリバース関数の例です:

package main

import "fmt"

func Reverse[T any](s []T) []T {
    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
        s[i], s[j] = s[j], s[i]
    }
    return s
}

func main() {
    ints := []int{1, 2, 3, 4, 5}
    reversedInts := Reverse(ints)
    fmt.Println(reversedInts)

    strings := []string{"apple", "banana", "cherry"}
    reversedStrings := Reverse(strings)
    fmt.Println(reversedStrings)
}

この例では、Reverse関数をGenericsを用いて汎用的に実装しています。このコードは、int型のスライスだけでなく、string型のスライスにも適用できます。

InterfaceとGenericsの組み合わせ

Genericsを用いることで、異なる型に対して一般的な処理を行うことができますが、Interfaceを組み合わせることで、さらに柔軟性を持たせることができます。以下はその例です:

package main

import (
    "fmt"
)

type Shape interface {
    Area() float64
}

type Rectangle struct {
    Width  float64
    Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

func CalculateArea[T Shape](shape T) float64 {
    return shape.Area()
}

func main() {
    rectangle := Rectangle{Width: 5, Height: 10}
    circle := Circle{Radius: 7}

    fmt.Printf("Rectangle Area: %.2f\n", CalculateArea(rectangle))
    fmt.Printf("Circle Area: %.2f\n", CalculateArea(circle))
}

このコードでは、Interface Shape を定義し、RectangleCircle がそれを実装しています。そして、Genericsを使用して CalculateArea 関数を定義し、異なる形状に対して一般的な面積の計算を行うことができます。

まとめ

GenericsとInterfaceはGolangのコードを効果的かつ柔軟にするための強力なツールです。この記事では、具体的なコード例を通じてその使い方を解説しました。GenericsとInterfaceを組み合わせることで、さらに高度なコードの再利用性と型安全性を実現できます。是非、自身のプロジェクトに応用してみてください。

タイトルとURLをコピーしました