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%のテストカバレッジを目指してください