이 글에서는 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한 줄씩 읽기
🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Golang과 Python의 주요 차이점은 동시성 모델, 유형 시스템, 성능 및 실행 속도입니다. 1. Golang은 동시 작업에 적합한 CSP 모델을 사용합니다. Python은 I/O 집약적 인 작업에 적합한 멀티 스레딩 및 Gil에 의존합니다. 2. Golang은 정적 유형이며 Python은 동적 유형입니다. 3. Golang 컴파일 된 언어 실행 속도는 빠르며 파이썬 해석 언어 개발은 빠릅니다.

Golang은 일반적으로 C보다 느리지 만 Golang은 동시 프로그래밍 및 개발 효율에 더 많은 장점이 있습니다. 1) Golang의 쓰레기 수집 및 동시성 모델은 높은 동시 시나리오에서 잘 수행합니다. 2) C는 수동 메모리 관리 및 하드웨어 최적화를 통해 더 높은 성능을 얻지 만 개발 복잡성이 높습니다.

Golang은 클라우드 컴퓨팅 및 DevOps에서 널리 사용되며 장점은 단순성, 효율성 및 동시 프로그래밍 기능에 있습니다. 1) 클라우드 컴퓨팅에서 Golang은 Goroutine 및 채널 메커니즘을 통해 동시 요청을 효율적으로 처리합니다. 2) DevOps에서 Golang의 빠른 편집 및 크로스 플랫폼 기능이 자동화 도구의 첫 번째 선택입니다.

Golang과 C는 각각 성능 효율성에서 고유 한 장점을 가지고 있습니다. 1) Golang은 Goroutine 및 Garbage Collection을 통해 효율성을 향상 시키지만 일시 중지 시간을 도입 할 수 있습니다. 2) C는 수동 메모리 관리 및 최적화를 통해 고성능을 인식하지만 개발자는 메모리 누출 및 기타 문제를 처리해야합니다. 선택할 때는 프로젝트 요구 사항 및 팀 기술 스택을 고려해야합니다.

Golang은 높은 동시성 작업에 더 적합하지만 Python은 유연성에 더 많은 장점이 있습니다. 1. Golang은 Goroutine 및 채널을 통해 동시성을 효율적으로 처리합니다. 2. Python은 GIL의 영향을받는 스레딩 및 Asyncio에 의존하지만 여러 동시성 방법을 제공합니다. 선택은 특정 요구 사항을 기반으로해야합니다.

Golang과 C의 성능 차이는 주로 메모리 관리, 컴파일 최적화 및 런타임 효율에 반영됩니다. 1) Golang의 쓰레기 수집 메커니즘은 편리하지만 성능에 영향을 줄 수 있습니다. 2) C의 수동 메모리 관리 및 컴파일러 최적화는 재귀 컴퓨팅에서 더 효율적입니다.

선택 GOLANGFORHIGHERFERFERFORMANDCONDCURRENCY, TILDFORBECTERVICES 및 NNETWORKPRAMPHING; SELECTPYTHONFORRAPIDDEVENTURMENT, DATASCIENCE 및 MACHINEARNINGDUETOITSTINTIVENDEXTENDIVERIRIES.

Golang과 Python은 각각 고유 한 장점이 있습니다. Golang은 고성능 및 동시 프로그래밍에 적합하지만 Python은 데이터 과학 및 웹 개발에 적합합니다. Golang은 동시성 모델과 효율적인 성능으로 유명하며 Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

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

WebStorm Mac 버전
유용한 JavaScript 개발 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

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