목차
파일 열기 및 닫기" >파일 열기 및 닫기
读取文件
" >读取文件
读取指定大小" >读取指定大小
代码" >代码
执行结果
" >执行结果
读取整个文件" >读取整个文件
代码" >代码
执行结果
" >执行结果
bufio" >bufio
读取整个文件
" >读取整个文件
写入文件" >写入文件
写入字节和写入行" >写入字节和写入行
bufio写文件
" >bufio写文件
ioutil写文件
" >ioutil写文件
拷贝文件
" >拷贝文件
백엔드 개발 Golang Go 언어의 기본 파일 작업을 안내하는 기사입니다.

Go 언어의 기본 파일 작업을 안내하는 기사입니다.

Jul 21, 2023 am 10:01 AM
언어로 가다

파일 열기 및 닫기

package main


import "os"


func main() {
    //os.Open是只读模式
    fileObj, err := os.Open("永不退缩.txt")
    if err != nil {
        panic(err)
}
    //关闭文件
    fileObj.Close()
    //一般情况下使用这种方式关闭文件
    defer fileObj.Close()
}
로그인 후 복사

참고: 를 사용하는 경우 GolandGoland,在学习文件操作这一块时,尽量不要右击运行,因为查找文件路径不一样

尽可能的编译成.exe, 파일 작업을 배울 때

Don을 시도해 보세요. 파일을 찾는 경로가 다르기 때문입니다

Go 언어의 기본 파일 작업을 안내하는 기사입니다.

최대한 많이

.exe🎜🎜 파일이므로 현재 디렉터리🎜🎜🎜🎜🎜🎜🎜🎜을 찾고 있습니다.

读取文件

读取指定大小

代码

func main() {
    //os.Open是只读模式
    fileObj, err := os.Open("永不退缩.txt")
    if err != nil {
        panic(err)
}
    var fileBytes = make([]byte,128)
    n, err := fileObj.Read(fileBytes)
    if err != nil {
        panic(err)
}
    fmt.Println(string(fileBytes[:n]))
    //一般情况下使用这种方式关闭文件
    defer fileObj.Close()
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.

可以发现,根本就没有读取完,并且还乱码了。


读取整个文件

上述我们只读取了128个字节,一个中文3个字节128/3,除下标点符号,应该是40个左右,明显不够

那该怎么办才能读取所有呢???

上述我们只读取了128个字节,我们可以在读取128个字节啊

然后找个罐子将每次读取的都装进去,读取完,装完,完美

代码

func main() {
    //os.Open是只读模式
    fileObj, err := os.Open("永不退缩.txt")
    if err != nil {
        panic(err)
}
    //一般情况下使用这种方式关闭文件
    defer fileObj.Close()


    var 罐子 []string
    var 每次读取字节 = make([]byte,128)
    for{
        n, err := fileObj.Read(每次读取字节)
        //err == io.EOF表示读完了,一定要放在err != nil前面
        if err == io.EOF {
            break
        }
        if err != nil {
            panic(err)
        }
        var 每次读取字符串 = string(每次读取字节[:n])
        罐子 = append(罐子,每次读取字符串)
}
    fmt.Println(罐子)
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.

会发现还是有乱码,这是为啥???

这是因为我们每次都是按照字节来读取一部分,一部分的,但是中文是3个字节,所有有时候可能切错了,就出现了乱码

那咋办呢?没办法,默认的读取文件就这么点功能,更多功能,尽在bufio


bufio

bufio可以理解为原生file操作的一个加强版,更牛叉,功能更多

还是上述这个文件,看看如何完美读取

代码

func main() {
    //os.Open是只读模式
    fileObj, err := os.Open("永不退缩.txt")
    if err != nil {
        panic(err)
}
    //一般情况下使用这种方式关闭文件
    defer fileObj.Close()


    //需要将文件对象传进去
    reader := bufio.NewReader(fileObj)
    for{
        //按行读取
        row, err := reader.ReadString('\n')//参数是字符,不是字符串
        if err == io.EOF {
            break
        }
        if err != nil {
            panic(err)
        }
        fmt.Printf("%v",row)
}
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.


读取整个文件

可能又有人说了,啊,星期八,我感觉还是麻烦,有没有更简单的办法读取文件,肯定有呀,一次性读取所有呢?答案是肯定的,此时需要用到ioutil包。

代码

func main() {
    //os.Open是只读模式
    bytes, err := ioutil.ReadFile("永不退缩.txt")
    if err != nil {
        panic(err)
}
    fmt.Println(string(bytes))
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.

但是这种有个缺点,只能读取小文件,要是来个10G文件也这样玩,保证电脑死机!!!


写入文件

写入文件的话,我们就需要使用openFile这个方法打开文件

在开始之前呢,先记一下下面几种模式

  • os.O_WRONLY 只写

  • os.O_RDONLY 只读

  • os.O_CREATE 如果文件不存在,则创建文件

  • os.O_RDWR 可读可写

  • os.O_TRUNC 清空

  • os.O_APPEND 追加文件

写入字节和写入行

代码

func main() {
    fileObj, err := os.OpenFile("临时.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        panic(err)
}
    defer fileObj.Close()
    w_content := "我是临时表内容\n"
    //Write方法需要将字符串转成字节
    fileObj.Write([]byte(w_content))
    //WriteString直接写入字符串
    fileObj.WriteString(w_content)
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.

bufio写文件

代码

func main() {
    fileObj, err := os.OpenFile("临时.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        panic(err)
}
    defer fileObj.Close()
    w_content := "我是临时表内容\n"
    writer := bufio.NewWriter(fileObj)
    writer.Write([]byte(w_content))
    writer.WriteString(w_content)
    //写完必须刷入
    writer.Flush()
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.


ioutil写文件

代码

func main() {
    w_content := "我是临时表内容\n"
    err := ioutil.WriteFile("临时.txt", []byte(w_content), 0666)
    if err != nil {
        panic(err)
}
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.


拷贝文件

拷贝文件,就是拷贝文件呗,A文件拷贝到B文件中

其实他的底层还是打开俩文件,把A文件内容写入到B文件中

代码

func main() {
    原文件, err := os.Open("永不退缩.txt")
    if err != nil {
        panic(err)
}
    defer 原文件.Close()
    目标文件, err := os.OpenFile("临时.txt", os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        panic(err)
}
    defer 目标文件.Close()
    //拷贝文件
    io.Copy(目标文件,原文件)
}
로그인 후 복사

执行结果

Go 언어의 기본 파일 작업을 안내하는 기사입니다.


总结

本次章节我们主要学习文件操作的相关知识,主要分为读取文件写入文件

读取文件都有原生方法读写bufio加强读写ioutil一次性读写

推荐大家使用bufio这个包操作文件,带有缓冲功能,性能更好!!

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

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 02:06 PM

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

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

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

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를 사용하는 것입니다 ...

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

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

Go 및 Viper 라이브러리를 사용할 때 포인터를 전달 해야하는 이유는 무엇입니까? Go 및 Viper 라이브러리를 사용할 때 포인터를 전달 해야하는 이유는 무엇입니까? Apr 02, 2025 pm 04:00 PM

Go Pointer Syntax 및 Viper Library 사용의 문제 해결 GO 언어로 프로그래밍 할 때 특히 포인터의 구문 및 사용법을 이해하는 것이 중요합니다.

See all articles