Table des matières
Ouvrir et fermer des fichiers" >Ouvrir et fermer des fichiers
读取文件
" >读取文件
读取指定大小" >读取指定大小
代码" >代码
执行结果
" >执行结果
读取整个文件" >读取整个文件
代码" >代码
执行结果
" >执行结果
bufio" >bufio
读取整个文件
" >读取整个文件
写入文件" >写入文件
写入字节和写入行" >写入字节和写入行
bufio写文件
" >bufio写文件
ioutil写文件
" >ioutil写文件
拷贝文件
" >拷贝文件
Maison développement back-end Golang Un article vous guidera à travers les opérations de base sur les fichiers du langage Go

Un article vous guidera à travers les opérations de base sur les fichiers du langage Go

Jul 21, 2023 am 10:01 AM
go语言

Ouvrir et fermer des fichiers

package main


import "os"


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

Remarque : Si vous utilisez GolandGoland,在学习文件操作这一块时,尽量不要右击运行,因为查找文件路径不一样

尽可能的编译成.exe, lors de l'apprentissage du fonctionnement des fichiers, essayez de

Don Je ne fais pas de clic droit pour exécuter

Un article vous guidera à travers les opérations de base sur les fichiers du langage Go

, car le chemin pour trouver le fichier est différent


🎜Compilez autant que possible dans 🎜🎜.exe🎜🎜 fichier, vous recherchez donc le répertoire actuel🎜🎜🎜🎜🎜🎜🎜🎜

读取文件

读取指定大小

代码

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()
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage 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(罐子)
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage 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)
}
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage Go


读取整个文件

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

代码

func main() {
    //os.Open是只读模式
    bytes, err := ioutil.ReadFile("永不退缩.txt")
    if err != nil {
        panic(err)
}
    fmt.Println(string(bytes))
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage 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)
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage 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()
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage Go


ioutil写文件

代码

func main() {
    w_content := "我是临时表内容\n"
    err := ioutil.WriteFile("临时.txt", []byte(w_content), 0666)
    if err != nil {
        panic(err)
}
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage 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(目标文件,原文件)
}
Copier après la connexion

执行结果

Un article vous guidera à travers les opérations de base sur les fichiers du langage Go


总结

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

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Apr 02, 2025 pm 04:00 PM

GO POINTER SYNTAXE ET ATTENDRE DES PROBLÈMES DANS LA BIBLIOTHÈQUE VIPER Lors de la programmation en langage Go, il est crucial de comprendre la syntaxe et l'utilisation des pointeurs, en particulier dans ...

See all articles