목차
整个文件读取
按行读取
逐个单词读取
以数据块的形式读取文件
二进制读取
전체 파일 읽기
한 줄씩 읽기< /strong>
단어 단위로 읽기
데이터 블록 형식으로 파일 읽기
바이너리 읽기
总结
백엔드 개발 Golang Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석

Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석

Apr 20, 2023 pm 06:28 PM
golang 언어로 가다

Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석

이 글에서는 Golang에서 파일을 읽는 방법에 대해 설명합니다. 이러한 파일을 처리하기 위해 다음 패키지를 사용합니다.

  • os 패키지는 운영 수준 작업을 수행하기 위한 플랫폼 독립적인 인터페이스를 제공합니다.
  • IOutil 패키지는 내부 구현에 대해 너무 많이 알지 않고도 파일 작업을 할 수 있는 사용하기 쉬운 유틸리티 기능을 제공합니다.
  • bufio 패키지는 버퍼링된 IO를 구현하여 입력 및 출력 작업의 성능과 처리량을 향상시키는 데 도움이 됩니다.
  • log 패키지는 간단한 로깅 패키지를 구현합니다. 우리는 이것을 프로그램 전반에 걸쳐 사용할 것입니다. 우리 프로그램에서는 로깅 패키지의 Fatal() 함수를 사용하겠습니다. 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) 方法
  • 返回:在一个字节数组中返回文件的内容和错误。一个成功的调用将返回 err == nil

内部 ReadFile 函数实现如下:

func ReadFile(filename string) ([]byte, error) {
    return os.ReadFile(filename)
}
로그인 후 복사

现在,让我们回到我们的程序:

  • ioutil.ReadFile("readthisfile.txt") 返回一个 byteArray 和一个 err。我们将byteArray 存储在 "content "变量中,错误存储在 " err "变量中。
  • 然后我们放置了一个 if 条件,如果 err 值不为 nil,我们将使用 log.Fatal() 函数打印错误 err 。记住,Fatal() 函数等同于 Print() 函数,然后调用 os.Exit(1)
  • 最后,我们将使用 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!
로그인 후 복사

按行读取

Scanner 扫描器提供了一个方便的接口来读取数据,比如一个由新行分隔的文本行组成的文件。它通过标记来读取数据;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。
  • 然后,我们使用扫描器来读取文件,并逐行扫描,直到文件内容结束。
  • 最后,我们要关闭该文件。

执行程序,结果如下:

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!
로그인 후 복사

以数据块的形式读取文件

一次性读取整个文件似乎是一种简单的方法,但有时我们需要从内存管理的角度使我们的程序得到一些优化。Golang 提供了一种分块读取文件的方法,而不是整个或甚至逐行读取。因为如果一行的大小太大,逐行读取也可能是低效的。

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

전체 파일 읽기

전체 파일을 한 번에 쉽게 읽고 변수에 저장할 수 있습니다. 하지만 대용량 파일에는 이 작업을 수행하면 안 된다는 점을 기억하세요. ioutil.ReadFile() 함수를 사용하여 파일을 읽고 파일 내용을 변수에 저장합니다. 🎜🎜먼저 프로그램과 동일한 디렉터리에 파일을 저장해 보겠습니다. 따라서 폴더 구조는 다음과 같습니다. 🎜
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))
	}
}
로그인 후 복사
로그인 후 복사
🎜 main.go 함수에 다음을 작성합니다. 🎜rrreee🎜하지만 먼저 ReadFile() 함수의 경우를 살펴보겠습니다. 🎜🎜🎜 정의: 메소드 선언 func ReadFile(filename string) ([]byte, error)🎜🎜Function: 함수 매개변수에 경로가 전달된 파일을 읽고 파일의 내용을 반환합니다. 내부적으로 사용되는 os.ReadFile(fileName) 메서드 🎜🎜Returns: 파일의 내용과 오류를 바이트 배열로 반환합니다. 성공적인 호출은 err == nil🎜을 반환합니다.🎜내부 ReadFile 함수는 다음과 같이 구현됩니다:🎜rrreee🎜이제 프로그램으로 돌아가겠습니다:🎜🎜🎜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 파일을 만들고 다음 내용을 작성합니다. 🎜rrreee🎜마지막으로 위 코드를 실행하면 다음 출력을 볼 수 있습니다. 🎜rrreee

한 줄씩 읽기< /strong>

🎜Scanner Scanner는 개행으로 구분된 텍스트 줄로 구성된 파일과 같은 데이터를 읽을 수 있는 편리한 인터페이스를 제공합니다. 마커를 통해 데이터를 읽습니다. Split 함수는 마커를 정의합니다. 기본적으로 이 함수는 데이터를 행으로 나누고 행 끝을 제거합니다. 🎜rrreee🎜🎜os.Open() 매개변수에 전달된 파일을 엽니다. 파일을 여는 동안 오류가 발생하면 동일한 오류가 반환됩니다. 그렇지 않으면 오류는 0이 됩니다. 🎜🎜그런 다음 스캐너를 사용하여 파일을 읽고 파일 내용이 끝날 때까지 한 줄씩 스캔합니다. 🎜🎜마지막으로 파일을 닫고 싶습니다. 🎜🎜프로그램을 실행하면 다음과 같은 결과가 나옵니다: 🎜🎜Go 언어로 파일을 읽는 방법은 무엇입니까? 다양한 방법에 대한 간략한 분석🎜

단어 단위로 읽기

🎜파일을 단어 단위로 읽을 수도 있습니다: 🎜rrreee🎜코드를 실행하세요: 🎜rrreee

데이터 블록 형식으로 파일 읽기

🎜전체 파일을 한 번에 읽는 것이 쉬운 방법인 것처럼 보이지만 때로는 프로그램을 최적화해야 할 때도 있습니다. Golang은 파일 전체를 읽거나 한 줄씩 읽는 대신 파일을 덩어리로 읽는 방법을 제공합니다. 행의 크기가 너무 크면 행 단위로 읽는 것도 비효율적일 수 있기 때문입니다. 🎜rrreee

바이너리 읽기

🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? Apr 02, 2025 pm 02:06 PM

Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Apr 02, 2025 pm 02:09 PM

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? GO의 어떤 라이브러리가 대기업에서 개발하거나 잘 알려진 오픈 소스 프로젝트에서 제공합니까? Apr 02, 2025 pm 04:12 PM

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? GO 언어에서 'var'와 'type` 키워드 정의 구조의 차이점은 무엇입니까? Apr 02, 2025 pm 12:57 PM

GO 언어에서 구조를 정의하는 두 가지 방법 : VAR과 유형 키워드의 차이. 구조를 정의 할 때 Go Language는 종종 두 가지 다른 글쓰기 방법을 본다 : 첫째 ...

Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Redis Stream을 사용하여 GO Language에서 메시지 대기열을 구현할 때 User_ID 유형 변환 문제를 해결하는 방법은 무엇입니까? Apr 02, 2025 pm 04:54 PM

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? 이동 중에 왜 println 및 string () 함수로 문자열이 다른 효과를 갖는 이유는 무엇입니까? Apr 02, 2025 pm 02:03 PM

Go Language의 문자열 인쇄의 차이 : println 및 String () 함수 사용 효과의 차이가 진행 중입니다 ...

다중 프로세스 로그를 작성할 때 동시성이 안전하고 효율적인지 확인하는 방법은 무엇입니까? 다중 프로세스 로그를 작성할 때 동시성이 안전하고 효율적인지 확인하는 방법은 무엇입니까? Apr 02, 2025 pm 03:51 PM

다중 프로세스 로그 쓰기에서 동시성 보안 문제를 효율적으로 처리합니다. 여러 프로세스는 동시에 동일한 로그 파일을 작성합니다. 동시성을 안전하고 효율적으로 보장하는 방법은 무엇입니까? 이것은 ...

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? 골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Apr 02, 2025 pm 05:09 PM

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

See all articles