goft - 課題

プロジェクト概要

goft (Go Foundation Types) は、Go言語の標準ライブラリにある基本的な文字列・スライス操作関数を再実装する課題です。C言語の libft に相当する Go 版として、言語の基礎を深く理解することを目的としています。

提出ファイル

goft/
├── go.mod
├── goft.go           # メイン実装ファイル
├── goft_bonus.go     # ボーナス関数(オプション)
└── goft_test.go      # テストファイル

マンダトリー要件

Part 1: 文字判定関数

以下の関数を実装してください:

func IsAlpha(r rune) bool      // アルファベット判定
func IsDigit(r rune) bool      // 数字判定
func IsAlnum(r rune) bool      // 英数字判定
func IsSpace(r rune) bool      // 空白文字判定
func IsPrint(r rune) bool      // 印字可能文字判定
func IsUpper(r rune) bool      // 大文字判定
func IsLower(r rune) bool      // 小文字判定
func ToUpper(r rune) rune      // 大文字変換
func ToLower(r rune) rune      // 小文字変換

Part 2: 文字列操作関数

func Strlen(s string) int                      // 文字列長(rune単位)
func Strchr(s string, c rune) int              // 文字検索(先頭から)
func Strrchr(s string, c rune) int             // 文字検索(末尾から)
func Strncmp(s1, s2 string, n int) int         // 文字列比較(n文字)
func Strdup(s string) string                   // 文字列複製
func Substr(s string, start, length int) string // 部分文字列
func Strjoin(s1, s2 string) string             // 文字列結合
func Strtrim(s string, set string) string      // 両端トリム
func Split(s string, sep rune) []string        // 文字列分割

Part 3: 数値変換関数

func Atoi(s string) int        // 文字列→整数変換
func Itoa(n int) string        // 整数→文字列変換

Part 4: メモリ操作関数(スライス版)

func Memset(b []byte, c byte, n int) []byte    // バイト埋め
func Memcpy(dst, src []byte, n int) []byte     // バイトコピー
func Memmove(dst, src []byte, n int) []byte    // オーバーラップ対応コピー
func Memcmp(s1, s2 []byte, n int) int          // バイト比較
func Memchr(s []byte, c byte, n int) int       // バイト検索

ボーナス要件

ボーナスは、マンダトリーが完璧に動作している場合のみ評価されます。

ジェネリクス版

Go 1.18+ のジェネリクスを使用した汎用関数:

func Map[T, U any](slice []T, f func(T) U) []U
func Filter[T any](slice []T, f func(T) bool) []T
func Reduce[T, U any](slice []T, initial U, f func(U, T) U) U
func Find[T any](slice []T, f func(T) bool) (T, bool)
func Contains[T comparable](slice []T, element T) bool

イテレータパターン

type Iterator[T any] interface {
    Next() (T, bool)
    HasNext() bool
}

func NewSliceIterator[T any](slice []T) Iterator[T]

禁止事項

  • 標準ライブラリの strings, strconv, unicode パッケージの使用禁止
  • fmt.Sprintf による数値変換禁止
  • reflect パッケージの使用禁止
  • 外部ライブラリの使用禁止
  • 実装上の注意

  • UTF-8 対応: Go の string は UTF-8 エンコードされています。rune を使用して正しく処理してください
  • nil スライス: nil スライスと空スライスを適切に区別してください
  • 境界チェック: パニックを起こさないよう、境界チェックを必ず実装してください
  • テストカバレッジ: 最低80%のテストカバレッジを目指してください