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。- 然后,我们使用扫描器来读取文件,并逐行扫描,直到文件内容结束。
- 最后,我们要关闭该文件。
执行程序,结果如下:
逐个单词读取
我们还可以通过逐个单词来读取文件:
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이 됩니다. 🎜🎜그런 다음 스캐너를 사용하여 파일을 읽고 파일 내용이 끝날 때까지 한 줄씩 스캔합니다. 🎜🎜마지막으로 파일을 닫고 싶습니다. 🎜🎜프로그램을 실행하면 다음과 같은 결과가 나옵니다: 🎜🎜
단어 단위로 읽기
🎜파일을 단어 단위로 읽을 수도 있습니다: 🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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

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