Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk membaca fail dalam bahasa Go? Analisis ringkas pelbagai kaedah

Bagaimana untuk membaca fail dalam bahasa Go? Analisis ringkas pelbagai kaedah

青灯夜游
青灯夜游ke hadapan
2023-04-20 18:28:453663semak imbas

Bagaimana untuk membaca fail dalam bahasa Go? Analisis ringkas pelbagai kaedah

Artikel ini akan membincangkan cara membaca fail di Golang. Kami akan menggunakan pakej berikut untuk memproses fail ini. Pakej

  • os menyediakan antara muka bebas platform untuk melaksanakan operasi peringkat operasi. Pakej
  • IOutil menyediakan fungsi utiliti yang mudah digunakan untuk bekerja dengan fail tanpa mengetahui banyak tentang pelaksanaan dalaman. Pakej
  • bufio melaksanakan IO penimbal, yang membantu kami meningkatkan prestasi dan pemprosesan operasi input dan output. Pakej
  • log melaksanakan pakej pengelogan mudah. Kami akan menggunakan ini sepanjang program. Kami akan menggunakan fungsi Fatal() pakej pengelogan dalam program kami.

Bacaan Seluruh Fail

Kami boleh membaca keseluruhan fail dengan mudah sekali gus dan menyimpannya dalam pembolehubah. Tetapi ingat, kita tidak sepatutnya melakukan ini dengan fail besar. Kami akan menggunakan fungsi ioutil.ReadFile() untuk membaca fail dan menyimpan kandungan fail dalam pembolehubah.

Pertama, mari kita simpan fail dalam direktori yang sama dengan program kami. Oleh itu, struktur folder kami akan kelihatan seperti ini.

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

Kami menulis perkara berikut dalam fungsi 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))
}

Tetapi pertama, mari kita bincangkan kes fungsi ReadFile():

  • Definisi: Fungsi pengisytiharan kaedah ReadFile(filename string) ([]byte, error)
  • Fungsi: Baca fail yang laluannya dihantar ke parameter fungsi dan kembalikan kandungan fail. Digunakan secara dalaman oleh kaedah os.ReadFile(fileName)
  • mengembalikan: kandungan fail dan ralat dalam tatasusunan bait. Panggilan yang berjaya akan kembali err == nil

Fungsi ReadFile dalaman dilaksanakan seperti berikut:

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

Sekarang, mari kita kembali ke program kami:

  • ioutil.ReadFile("readthisfile.txt") Mengembalikan byteArray dan ralat. Kami menyimpan byteArray dalam pembolehubah "content " dan ralat dalam pembolehubah " err ".
  • Kemudian kita letakkan syarat if dan jika nilai err bukan nol, kita akan print error err menggunakan fungsi log.Fatal(). Ingat, fungsi Fatal() adalah bersamaan dengan fungsi Print(), yang kemudiannya memanggil os.Exit(1) .
  • Akhir sekali, kami akan mencetak kandungan fail menggunakan fungsi fmt.Println(). Kita tidak boleh hanya mencetak pembolehubah content kerana ia adalah tatasusunan bait, kita perlu menukarnya kepada rentetan: string(content)

Kemudian buat fail ilovego.txt baharu dan tuliskannya seperti berikut Kandungan:

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

Akhir sekali, laksanakan kod di atas dan anda boleh melihat output berikut:

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

Baca baris demi baris

Imbasan pengimbas Pengkompil menyediakan antara muka yang mudah untuk membaca data, seperti fail yang terdiri daripada baris teks yang dibatasi baris baharu. Ia membaca data melalui tag; fungsi Split mentakrifkan tag. Secara lalai, fungsi ini memecahkan data ke dalam baris dan menjalurkan penghujung baris.

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() Buka fail yang diluluskan dalam parameter. Jika sebarang ralat ditemui semasa membuka fail, ia akan mengembalikan ralat yang sama. Jika tidak, ralat akan menjadi sifar.
  • Kami kemudian menggunakan pengimbas untuk membaca fail dan mengimbas baris demi baris sehingga akhir kandungan fail.
  • Akhir sekali, kami mahu menutup fail.

Laksanakan program dan hasilnya adalah seperti berikut:

Bagaimana untuk membaca fail dalam bahasa Go? Analisis ringkas pelbagai kaedah

Baca perkataan demi perkataan

Kita juga boleh lulus Baca fail perkataan demi perkataan:

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)
	}
}

Jalankan kod:

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

Baca fail dalam ketulan

Satu masa Membaca keseluruhan fail kelihatan seperti cara yang mudah, tetapi kadangkala kita perlu membuat program kami beberapa pengoptimuman dari perspektif pengurusan memori. Golang menyediakan cara untuk membaca fail dalam ketulan dan bukannya membacanya secara keseluruhan atau malah baris demi baris. Kerana jika saiz baris terlalu besar, membaca baris demi baris juga mungkin tidak cekap. Pakej

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()
}

Bacaan binari

hex melaksanakan pengekodan dan penyahkodan heksadesimal.

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教程

Atas ialah kandungan terperinci Bagaimana untuk membaca fail dalam bahasa Go? Analisis ringkas pelbagai kaedah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam