ホームページ >バックエンド開発 >Golang >Go 言語でファイルを読み取るにはどうすればよいですか?さまざまな手法の簡単な分析

Go 言語でファイルを読み取るにはどうすればよいですか?さまざまな手法の簡単な分析

青灯夜游
青灯夜游転載
2023-04-20 18:28:453813ブラウズ

Go 言語でファイルを読み取るにはどうすればよいですか?さまざまな手法の簡単な分析

この記事では、Golang でファイルを読み取る方法について説明します。これらのファイルを処理するには次のパッケージを使用します。

  • os パッケージは、操作レベルの操作を実行するためのプラットフォームに依存しないインターフェイスを提供します。
  • IOutil このパッケージは、内部実装についてあまり知らなくてもファイルを操作できる使いやすいユーティリティ関数を提供します。
  • bufio パッケージはバッファリングされた IO を実装しており、入出力操作のパフォーマンスとスループットの向上に役立ちます。
  • log パッケージは、単純なログ記録パッケージを実装します。これをプログラム全体で使用します。プログラムではログパッケージの Fatal() 関数を使用します。

ファイル全体の読み取り

ファイル全体を一度に簡単に読み取り、変数に保存できます。ただし、大きなファイルに対してこれを行うべきではないことに注意してください。 ioutil.ReadFile() 関数を使用してファイルを読み取り、ファイルの内容を変数に保存します。

まず、プログラムと同じディレクトリにファイルを保存しましょう。したがって、フォルダー構造は次のようになります。

___ 
| 
|_ _ _ _ ilovego.txt | 
|_ _ _ _ main.go

main.go 関数に次のように記述します:

package main

import (
	"fmt"
	"io/ioutil"
	"log"
)

func main() {

	content, err := ioutil.ReadFile("ilovego.txt")

	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(string(content))
}

ただし、まず ReadFile() 関数について説明します。 状況:

  • 定義: メソッド宣言 func ReadFile(filename string) ([]byte, error)
  • 関数: 読み取りパスが関数パラメータ ファイルに渡され、ファイルの内容を返します。内部的に使用される os.ReadFile(fileName) メソッド
  • Returns: ファイルの内容とエラーをバイト配列で返します。呼び出しが成功すると、err == nil

内部 ReadFile 関数は次のように実装されます:

func ReadFile(filename string) ([]byte, error) {
    return os.ReadFile(filename)
}

さて、プログラムに戻りましょう:

  • ioutil.ReadFile("readthisfile.txt") byteArray とエラーを返します。 byteArray を「content」変数に保存し、エラーを「err」変数に保存します。
  • 次に、if 条件を設定します。err 値が nil でない場合は、log.Fatal() 関数を使用してエラー err を出力します。 Fatal() 関数は、os.Exit(1) を呼び出す Print() 関数と同等であることに注意してください。
  • 最後に、fmt.Println() 関数を使用してファイルの内容を印刷します。 content 変数はバイト配列であり、文字列に変換する必要があるため、単純に出力することはできません。 string(content)

次に、新しい ilovego.txt ファイルを作成し、次の内容を書き込みます:

I Love Golang,
This is One of the Best Languages on the World!

最後に、上記のコードを実行すると、次の出力が表示されます:

$ go run main.go
I Love Golang, 
This is One of the Best Languages on the World!

Press line読み取り

スキャナ スキャナは、改行で区切られたテキスト行で構成されるファイルなどのデータを読み取るための便利なインターフェイスを提供します。マーカーを介してデータを読み取ります。Split 関数はマーカーを定義します。デフォルトでは、この関数はデータを行に分割し、行の端を削除します。

package main

import (
	"fmt"
	// "io/ioutil"
	"bufio"
	"log"
	"os"
)

func main() {

	// opening the file using Open function
	f, err := os.Open("ilovego.txt")

	if err != nil {
		log.Fatal(err)
	}

	defer f.Close()

	// create a scanner for the file
	scanner := bufio.NewScanner(f)

	// loop through the scanner until it return fasle
	for scanner.Scan() {

		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}
  • os.Open() パラメータで渡されたファイルを開きます。ファイルを開くときにエラーが発生した場合は、同じエラーが返されます。それ以外の場合、エラーは nil になります。
  • 次に、スキャナを使用してファイルを読み取り、ファイルの内容の終わりまで 1 行ずつスキャンします。
  • 最後に、ファイルを閉じます。

プログラムを実行すると、結果は次のようになります:

Go 言語でファイルを読み取るにはどうすればよいですか?さまざまな手法の簡単な分析

単語ごとに読み取ります

ファイルを単語ごとに読み取る:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {

	f, err := os.Open("ilovego.txt")

	if err != nil {
		fmt.Println(err)
	}

	defer f.Close()

	scanner := bufio.NewScanner(f)
	scanner.Split(bufio.ScanWords)

	for scanner.Scan() {

		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		fmt.Println(err)
	}
}

コードを実行する:

$ go run main.go
I
Love
Golang,
This
is
One
of
the
Best
Languages
on
the
World!

ファイルをチャンクで読み取る

ファイル全体を読み取ることもできます。 at Once これは簡単な方法のように思えますが、メモリ管理の観点からプログラムを最適化する必要がある場合があります。 Golang は、ファイル全体を読み取るのではなく、あるいは 1 行ずつ読み取るのではなく、ファイルを分割して読み取る方法を提供します。行のサイズが大きすぎると、行ごとの読み取りも非効率になる可能性があるためです。

package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {

	f, err := os.Open("ilovego.txt")

	if err != nil {
		log.Fatal(err)
	}

	defer f.Close()

	reader := bufio.NewReader(f)
	buf := make([]byte, 16)

	for {
                // reading a file upto buffer
		n, err := reader.Read(buf)

		if err != nil {

			if err != io.EOF {

				log.Fatal(err)
			}

			break
		}

		fmt.Print(string(buf[0:n]))
	}

	fmt.Println()
}

バイナリ読み取り

hex パッケージは 16 進数のエンコードとデコードを実装します。

package main

import (
	"bufio"
	"encoding/hex"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {

	f, err := os.Open("sid.jpg")

	if err != nil {
		log.Fatal(err)
	}

	defer f.Close()

	reader := bufio.NewReader(f)
	buf := make([]byte, 256)

	for {
		_, err := reader.Read(buf)

		if err != nil {
			if err != io.EOF {
				fmt.Println(err)
			}
			break
		}

		fmt.Printf("%s", hex.Dump(buf))
	}
}

总结

本文介绍了 Go 语言读取文件的几种方式,ioutil.ReadFile 函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。希望能对你有所帮助!

推荐学习:Golang教程

以上がGo 言語でファイルを読み取るにはどうすればよいですか?さまざまな手法の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。