go-reader - 課題

プロジェクト概要

go-reader は、ファイルから1行ずつ読み込む関数を実装する課題です。C言語の get_next_line に相当し、バッファリングとファイルI/Oの理解を深めます。

提出ファイル

go-reader/
├── go.mod
├── reader.go         # メイン実装
└── reader_test.go    # テスト

マンダトリー要件

実装する関数

// GetNextLine はファイルディスクリプタから1行読み込む
// 行末の改行文字を含む
// EOF に達した場合は残りの文字列を返し、次の呼び出しで "" を返す
func GetNextLine(fd int) (string, error)

// Reader 構造体を使用したバージョン
type LineReader struct {
    // 内部実装
}

func NewLineReader(r io.Reader) *LineReader
func (lr *LineReader) ReadLine() (string, error)

動作仕様

  • 改行文字: 行末の \n を含めて返す
  • バッファサイズ: 固定サイズのバッファを使用(デフォルト: 1024バイト)
  • 複数fd対応: 複数のファイルディスクリプタを同時に扱える
  • EOF処理: ファイル末尾に達したら io.EOF を返す
  • 使用例

    fd, _ := syscall.Open("file.txt", syscall.O_RDONLY, 0)
    defer syscall.Close(fd)
    
    for {
        line, err := GetNextLine(fd)
        if err == io.EOF {
            break
        }
        fmt.Print(line)
    }
    

    ボーナス要件

  • 複数の区切り文字をサポート
  • バッファサイズの動的変更
  • 先読みバッファのサポート
  • 禁止事項

  • bufio パッケージの使用禁止
  • ioutil.ReadFile の使用禁止
  • 外部ライブラリの使用禁止
  • 実装上の注意

  • バッファ管理: 読み込んだデータをバッファに保持
  • 状態保持: 複数回の呼び出し間で状態を保持
  • メモリリーク: 不要になったバッファを適切に解放