Go言語でファイルを読み込む方法!全読み・一行ずつの読み方を初心者向けに徹底解説
生徒
「Go言語でファイルを読み込むってどうやるんですか?」
先生
「Go言語では、ファイルを丸ごと読む方法や、一行ずつ読む方法などいくつかのやり方があります。」
生徒
「一行ずつ読むってどういうことですか?」
先生
「例えばテキストファイルを一行ずつ順番に処理する方法です。ログファイルなどを扱うときによく使います。」
生徒
「なるほど、全部読む方法と使い分けるんですね!」
先生
「その通りです。それでは基本から順番に見ていきましょう。」
1. Go言語でファイル読み込みとは
Go言語でのファイル読み込みとは、パソコンに保存されているテキストファイルやデータファイルの内容をプログラムで取得することです。 ファイルとは、メモ帳で作る文章やログデータなどのことを指します。
初心者の方は、まず「ファイルの中身をプログラムで取り出す」というイメージを持つことが大切です。 例えば、ノートに書いた内容を読み返すように、プログラムがファイルを読み取るという仕組みです。
Go言語では主に以下の方法でファイルを読み込みます。
- ファイルを一括で読み込む方法
- ファイルを一行ずつ読み込む方法
2. ファイルを丸ごと読み込む方法
ファイル全体を一度に読み込む方法は、小さなファイルを扱うときに便利です。
Go言語では os.ReadFile を使うことで簡単に実現できます。
package main
import (
"fmt"
"os"
)
func main() {
data, err := os.ReadFile("sample.txt")
if err != nil {
fmt.Println("エラー:", err)
return
}
fmt.Println(string(data))
}
このコードでは、ファイルの内容をまとめて読み込み、文字列として表示しています。
data はバイトというデータ形式なので、文字列に変換して表示します。
3. os.ReadFileの仕組みと注意点
os.ReadFile は便利ですが、ファイルサイズが大きい場合は注意が必要です。
なぜなら、すべての内容を一度にメモリに読み込むためです。
メモリとは、パソコンが一時的にデータを保存する場所です。 大きなファイルを読み込むと、動作が遅くなったりエラーになる可能性があります。
小さな設定ファイルや短いテキストには最適ですが、大量データには別の方法を使いましょう。
4. bufioを使って一行ずつ読み込む方法
ファイルを一行ずつ読みたい場合は、bufio パッケージを使います。
これは効率よくデータを処理するための仕組みです。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println("エラー:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
この方法では、ファイルを一行ずつ順番に読み込みます。 大きなファイルでも効率よく処理できるのが特徴です。
5. Scannerの動きと仕組み
Scanner は、ファイルを少しずつ読み込んで処理する仕組みです。
一行ずつ読み取ることで、メモリの使用量を抑えることができます。
Scan() は次の行があるかどうかを確認し、
Text() でその行の内容を取得します。
このように処理を繰り返すことで、ファイル全体を安全に扱えます。
6. ファイルを開くときの基本処理
ファイルを扱うときは、必ず開いて閉じるという流れが必要です。
Go言語では os.Open を使ってファイルを開きます。
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println("エラー:", err)
return
}
defer file.Close()
defer は、処理が終わったときに自動でファイルを閉じる命令です。
閉じ忘れるとエラーの原因になるため、必ず書く習慣をつけましょう。
7. エラー処理の重要性
ファイル読み込みではエラー処理が非常に重要です。 ファイルが存在しない場合や、アクセス権がない場合などにエラーが発生します。
if err != nil {
fmt.Println("ファイル読み込みに失敗しました")
return
}
エラー処理をしないと、プログラムが突然止まる原因になります。 初心者の方でも必ず書くようにしましょう。
8. 全読みと一行読みの使い分け
Go言語でファイルを読み込むときは、用途によって方法を使い分けることが重要です。
- 小さいファイルは全読み込み
- 大きいファイルは一行ずつ読み込み
例えば、設定ファイルは全読み込み、ログファイルは一行ずつ読み込みという使い方が一般的です。
この使い分けを理解することで、効率的で安全なプログラムを書くことができます。
まとめ
Go言語でファイルを読み込む方法には、大きく分けてファイル全体を一度に読み込む方法と、一行ずつ順番に読み込む方法があります。どちらもテキストファイルや設定ファイル、ログファイルなどを扱うときに役立つ基本的な処理です。Go言語でファイル操作を学ぶときは、単に読み込み方法を覚えるだけではなく、ファイルの大きさや用途によって適切な方法を選ぶことが重要です。
小さなファイルを手軽に読み込みたい場合は、os.ReadFileを使う方法が分かりやすく便利です。ファイルの内容をまとめて取得できるため、短い設定ファイルや小規模なテキストファイルを扱う場合に向いています。一方で、ファイル全体を一度にメモリへ読み込むため、大きなファイルに対して無条件に使うとメモリ使用量が増える可能性があります。
Go言語のファイル読み込みでは、小さなファイルなら全読み込み、大きなファイルやログファイルなら一行ずつ読み込むという考え方を持っておくと、処理方法を選びやすくなります。
os.ReadFileを使った全読み込みを振り返ろう
os.ReadFileは、指定したファイルの内容を一度に読み込むための機能です。書き方が比較的シンプルなので、Go言語初心者が最初にファイル読み込みを練習するときにも向いています。ファイルを読み込むと、内容はバイト列として取得されます。そのため、文章として画面に表示したい場合は文字列へ変換して利用します。
package main
import (
"fmt"
"os"
)
func main() {
data, err := os.ReadFile("sample.txt")
if err != nil {
fmt.Println("ファイル読み込みに失敗しました")
return
}
fmt.Println(string(data))
}
このプログラムでは、sample.txtというファイルを読み込み、読み込みに成功した場合はその内容を文字列として表示しています。ファイルが存在しない場合や正常に読み込めない場合にはエラーが返されるため、読み込み直後にエラー処理を行っています。
os.ReadFileを利用する場合は、自分でファイルを開いて閉じる処理を書かなくてもファイル全体を読み込める点が分かりやすいところです。短いテキストファイルの内容を取得して、そのまま画面へ表示したり、後続処理に利用したりするときに便利です。
全読み込みではメモリ使用量を意識する
os.ReadFileは便利ですが、どのようなサイズのファイルにも適しているわけではありません。ファイル全体を一度に読み込むため、ファイルの容量が大きくなるほど使用するメモリも増えていきます。
メモリとは、プログラムが処理中のデータを一時的に保持する場所です。例えば非常に大きなログファイルを丸ごと読み込もうとすると、一度に大量のデータをメモリへ載せることになります。その結果、処理が重くなったり、ほかの処理に影響が出たりする可能性があります。
そのため、小さな設定ファイルや短い文章など、内容をまとめて扱いたい場合は全読み込みが便利です。一方で、何千行、何万行と続くログファイルのように大きくなりやすいファイルでは、一行ずつ処理する方法を検討するとよいでしょう。
bufio.Scannerを使うと一行ずつ読み込める
Go言語でファイルを一行ずつ読み込みたい場合は、bufioパッケージのScannerを利用できます。一行ずつ順番に読み取ることで、ファイル全体を最初からメモリへ読み込む必要がありません。そのため、大きなテキストファイルやログファイルを順番に処理するときに使いやすい方法です。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println("ファイルを開けませんでした")
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
この例では、最初にos.Openでファイルを開いています。その後、bufio.NewScannerを使ってScannerを作成し、繰り返し処理の中で一行ずつ読み込んでいます。ScannerのScanは次のデータを読み取れるか確認し、Textを使うことで現在読み込んでいる行の内容を取得できます。
一行読み込みの考え方は、長い文章を最初から全部暗記するのではなく、一行ずつ順番に読んで処理するイメージに近いです。ログファイルから特定の行を探したり、一行ずつ内容を変換したりする処理にも応用できます。
os.Openを使ったらファイルを閉じることも大切
os.Openを使ってファイルを開いた場合は、処理が終わったあとにファイルを閉じる必要があります。ファイルを開いたままにしておくと、プログラムが利用している資源が適切に解放されない原因になります。そのため、Go言語のファイル操作では開く処理と閉じる処理を一組として覚えることが重要です。
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println("ファイルを開けませんでした")
return
}
defer file.Close()
deferを使うと、その関数の処理が終わるときに指定した処理を実行できます。ファイルを正常に開いたあとでdeferを使ってCloseを指定しておけば、後続処理が終わったときにファイルを閉じる流れを作れます。
初心者のうちは、ファイルを読み込めたことだけに注目してしまい、閉じる処理を忘れやすいことがあります。os.Openを使ったらCloseも必要になるという組み合わせを意識しておくと、Go言語のファイル操作を安全に書きやすくなります。
ファイル読み込みではエラー処理を必ず確認する
ファイル読み込みは、必ず成功する処理ではありません。指定したファイル名が間違っている場合、ファイルそのものが存在しない場合、アクセスする権限がない場合など、さまざまな理由で失敗する可能性があります。
Go言語では、ファイル操作の結果と一緒にエラー情報を受け取ることができます。エラーが発生している場合には、そのまま次の処理へ進まず、メッセージを表示して終了するなどの対応を行います。
if err != nil {
fmt.Println("ファイル読み込みに失敗しました")
return
}
エラー処理を入れておくことで、読み込みに失敗しているのに正常なファイルがあるものとして処理を続けてしまうことを防げます。Go言語のファイル読み込みでは、os.ReadFileでもos.Openでも、まずエラーを確認する習慣を身につけておくことが大切です。
ScannerのScanとTextの役割を整理しよう
bufio.Scannerを初めて使うと、ScanとTextの違いが分かりにくく感じることがあります。Scanは次の行を読み取れるかどうかを確認しながら読み込みを進めるための処理です。Textは、現在Scannerが読み取った内容を文字列として取得するために使います。
繰り返し処理の条件としてScanを使うことで、読み込める行がある間だけ処理を続けられます。そして繰り返しの中でTextを使うと、その時点の一行分の内容を取得できます。この二つを組み合わせることで、先頭から最後まで一行ずつ順番にファイルを処理できます。
- os.ReadFileは、ファイル全体をまとめて読み込みたいときに使います。
- os.Openは、ファイルを開いて後続の処理で利用したいときに使います。
- bufio.NewScannerは、開いたファイルを少しずつ読み取るために利用します。
- Scanは、次の行を読み込みながら処理を進めるために使います。
- Textは、読み取った現在の行の内容を取得するときに使います。
- deferとCloseは、開いたファイルを処理終了時に閉じるために利用します。
設定ファイルとログファイルでは読み方を使い分ける
ファイル読み込みの方法は、扱うファイルの特徴によって選ぶと分かりやすくなります。例えば、数行程度の小さな設定ファイルであれば、ファイル全体をまとめて読み込んでもメモリへの負担は大きくありません。そのため、os.ReadFileを使って簡単に処理できます。
一方で、毎日追記されて大きくなるログファイルでは、一行ずつ読み込む方法が適しています。ログファイルの全内容を一度にメモリへ読み込む必要がなく、現在読み取っている行を順番に処理できます。
このように、全読み込みと一行読み込みはどちらか一方だけ覚えればよいものではありません。ファイルの大きさや処理内容を確認し、それぞれの特徴に合わせて使い分けることが、Go言語で効率的なファイル処理を書くための基本です。
Go言語のファイル読み込みで覚えておきたいポイント
小さなテキストファイルは全体をまとめて読み込む方法が簡単です。
大きなログファイルは一行ずつ読み込む方法が向いています。
ファイルを開いた場合は処理終了後に閉じることを忘れないようにします。
ファイルが存在しない場合などを考えてエラー処理を行います。
ファイルの大きさと処理目的を確認して読み込み方法を選ぶことが大切です。
全読み込みと一行読み込みの違いを比較して覚えよう
全読み込みは、ファイル全体を一つのデータとして扱いたい場合に便利です。短い文章をまとめて表示したり、設定ファイル全体を読み取って後から解析したりする処理では分かりやすい方法です。書き方も比較的短いため、Go言語初心者がファイル読み込みの仕組みを確認する最初の練習にも向いています。
一行読み込みは、ファイルの内容を順番に処理したい場合に向いています。例えばログファイルを上から一行ずつ確認する処理では、現在必要な行を読みながら処理を進められます。ファイル全体を一度に読み込まないため、大量のデータを扱うときにも全読み込みよりメモリ使用量を抑えやすくなります。
どちらの方法でも、最終的な目的はファイルの中に保存されている情報をGo言語のプログラムから利用することです。そのため、まずどのようなファイルを読みたいのか、そのファイルはどの程度の大きさなのか、内容をまとめて使いたいのか、一行ずつ順番に処理したいのかを考えてから方法を選ぶとよいでしょう。
ファイル読み込みの基本を身につけるとできることが広がる
Go言語でファイルを読み込めるようになると、プログラムの中に直接書いた値だけではなく、外部に保存されているデータを利用できるようになります。例えばテキストファイルに保存されている文章を表示したり、設定ファイルの内容を読み取ったり、ログファイルを一行ずつ確認したりできます。
ファイル操作は、Go言語で実用的なプログラムを作るときによく利用する基本処理です。最初はsample.txtのような短いファイルを作り、os.ReadFileで全体を表示するところから始めると分かりやすいでしょう。その後、同じファイルをos.Openとbufio.Scannerで一行ずつ読み込んでみると、二つの方法の違いを実際の動作から理解できます。
ファイル読み込みでは、読み込むための機能だけでなく、エラー処理、ファイルを閉じる処理、メモリ使用量なども一緒に考える必要があります。このような基本を一つずつ身につけることで、単に動くだけではなく、安全で効率的なGo言語のプログラムを書けるようになります。
Go言語のファイル読み込み、os.ReadFile、os.Open、bufio.Scanner、Scan、Text、defer、Close、エラー処理、全読み込み、一行読み込みといった用語は、今後ファイル操作を学習するときに何度も登場します。最初からすべてを暗記するのではなく、小さなサンプルを動かしながら、それぞれがどの役割を担当しているのかを確認すると理解しやすくなります。
まずは小さなファイルなら全読み込み、大きなファイルなら一行ずつ読み込みという基本的な使い分けを覚えましょう。そして、ファイルを開いたときには閉じること、読み込みが失敗する可能性を考えてエラーを確認することも習慣にします。この基本が身につけば、設定ファイルやログファイルなど、さまざまなファイルを扱う処理へ応用できるようになります。
生徒
「Go言語でファイルを読む方法は一つだけじゃなくて、全部まとめて読む方法と一行ずつ読む方法があるんですね。」
先生
「そうです。ファイルの大きさや、読み込んだ後にどのような処理をしたいかによって使い分けます。」
生徒
「短い設定ファイルならos.ReadFileで全部読んでも問題になりにくいということですね。」
先生
「その通りです。小さなファイルなら書き方も分かりやすく、全体をまとめて扱えるので便利です。」
生徒
「逆に、大きなログファイルを全部読み込むとメモリをたくさん使う可能性があるから、一行ずつ読んだほうがいいんですね。」
先生
「そうですね。bufio.Scannerを使えば、一行ずつ順番に読みながら処理できます。」
生徒
「ScannerのScanで次の行を読んで、Textでその行の内容を取り出すという流れも分かりました。」
先生
「その理解で大丈夫です。繰り返し処理と組み合わせれば、ファイルの先頭から最後まで一行ずつ処理できます。」
生徒
「os.Openを使ったときは、deferでCloseすることも忘れないようにしたほうがいいんですよね。」
先生
「はい。ファイルを開いたら、使い終わったあとに閉じるところまでを一つの流れとして覚えておきましょう。」
生徒
「それと、ファイルがない場合もあるから、読み込みやファイルを開いた直後にエラー確認をする必要があるんですね。」
先生
「その点も大切です。ファイル操作は必ず成功するとは限りません。エラーを確認してから次の処理へ進むことで、安全なプログラムになります。」
生徒
「まずは同じsample.txtを全読み込みと一行読み込みの両方で試して、違いを確認してみます。」
先生
「それが分かりやすい学習方法です。os.ReadFileとbufio.Scannerの両方を実際に動かして、ファイルサイズや用途によって適切な読み込み方法を選べるようにしていきましょう。」
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!