欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言IO輸入輸出底層原理及文件操作API

 更新時(shí)間:2023年01月08日 10:41:54   作者:夏沫的夢(mèng)  
這篇文章主要為大家介紹了Go語(yǔ)言IO輸入輸出底層原理及文件操作API示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1.輸入輸出的底層原理

終端其實(shí)是一個(gè)文件,相關(guān)實(shí)例如下:

  • os.Stdin:標(biāo)準(zhǔn)輸入的文件實(shí)例,類(lèi)型為*File
  • os.Stdout:標(biāo)準(zhǔn)輸出的文件實(shí)例,類(lèi)型為*File
  • os.Stderr:標(biāo)準(zhǔn)錯(cuò)誤輸出的文件實(shí)例,類(lèi)型為*File

以文件的方式操作終端:

package main
import "os"
func main() {
    var buf [16]byte
    os.Stdin.Read(buf[:])
    os.Stdin.WriteString(string(buf[:]))
}

2. 文件操作相關(guān)API

  • func Create(name string) (file *File, err Error) 根據(jù)提供的文件名創(chuàng)建新的文件,返回一個(gè)文件對(duì)象,默認(rèn)權(quán)限是0666
  • func NewFile(fd uintptr, name string) *File 根據(jù)文件描述符創(chuàng)建相應(yīng)的文件,返回一個(gè)文件對(duì)象
  • func Open(name string) (file *File, err Error) 只讀方式打開(kāi)一個(gè)名稱(chēng)為name的文件
  • func OpenFile(name string, flag int, perm uint32) (file *File, err Error) 打開(kāi)名稱(chēng)為name的文件,flag是打開(kāi)的方式,只讀、讀寫(xiě)等,perm是權(quán)限
  • func (file *File) Write(b []byte) (n int, err Error) 寫(xiě)入byte類(lèi)型的信息到文件
  • func (file *File) WriteAt(b []byte, off int64) (n int, err Error) 在指定位置開(kāi)始寫(xiě)入byte類(lèi)型的信息
  • func (file *File) WriteString(s string) (ret int, err Error) 寫(xiě)入string信息到文件
  • func (file *File) Read(b []byte) (n int, err Error) 讀取數(shù)據(jù)到b中
  • func (file *File) ReadAt(b []byte, off int64) (n int, err Error) 從off開(kāi)始讀取數(shù)據(jù)到b中
  • func Remove(name string) Error 刪除文件名為name的文件

3. 打開(kāi)和關(guān)閉文件

os.Open()函數(shù)能夠打開(kāi)一個(gè)文件,返回一個(gè)*File和一個(gè)err。對(duì)得到的文件實(shí)例調(diào)用close()方法能夠關(guān)閉文件。

package main
import (
    "fmt"
    "os"
)
func main() {
    // 只讀方式打開(kāi)當(dāng)前目錄下的main.go文件
    file, err := os.Open("./main.go")
    if err != nil {
        fmt.Println("open file failed!, err:", err)
        return
    }
    // 關(guān)閉文件
    file.Close()
}

4. 寫(xiě)文件

package main
import (
    "fmt"
    "os"
)
func main() {
    // 新建文件
    file, err := os.Create("./xxx.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()
    for i := 0; i < 5; i++ {
        file.WriteString("ab\n")
        file.Write([]byte("cd\n"))
    }
}

5. 讀文件

文件讀取可以用file.Read()和file.ReadAt(),讀到文件末尾會(huì)返回io.EOF的錯(cuò)誤

package main
import (
    "fmt"
    "io"
    "os"
)
func main() {
    // 打開(kāi)文件
    file, err := os.Open("./xxx.txt")
    if err != nil {
        fmt.Println("open file err :", err)
        return
    }
    defer file.Close()
    // 定義接收文件讀取的字節(jié)數(shù)組
    var buf [128]byte
    var content []byte
    for {
        n, err := file.Read(buf[:])
        if err == io.EOF {
            // 讀取結(jié)束
            break
        }
        if err != nil {
            fmt.Println("read file err ", err)
            return
        }
        content = append(content, buf[:n]...)
    }
    fmt.Println(string(content))
}

6. 拷貝文件

package main
import (
    "fmt"
    "io"
    "os"
)
func main() {
    // 打開(kāi)源文件
    srcFile, err := os.Open("./xxx.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 創(chuàng)建新文件
    dstFile, err2 := os.Create("./abc2.txt")
    if err2 != nil {
        fmt.Println(err2)
        return
    }
    // 緩沖讀取
    buf := make([]byte, 1024)
    for {
        // 從源文件讀數(shù)據(jù)
        n, err := srcFile.Read(buf)
        if err == io.EOF {
            fmt.Println("讀取完畢")
            break
        }
        if err != nil {
            fmt.Println(err)
            break
        }
        //寫(xiě)出去
        dstFile.Write(buf[:n])
    }
    srcFile.Close()
    dstFile.Close()
}

7. bufio

  • bufio包實(shí)現(xiàn)了帶緩沖區(qū)的讀寫(xiě),是對(duì)文件讀寫(xiě)的封裝
  • bufio緩沖寫(xiě)數(shù)據(jù)

os.O_WRONLY //只寫(xiě) os.O_CREATE //創(chuàng)建文件 os.O_RDONLY //只讀

os.O_RDWR //讀寫(xiě) os.O_TRUNC //清空 os.O_APPEND //追加

  • bufio讀數(shù)據(jù)
package main
import (
    "bufio"
    "fmt"
    "io"
    "os"
)
func wr() {
    // 參數(shù)2:打開(kāi)模式,所有模式d都在上面
    // 參數(shù)3是權(quán)限控制
    // w寫(xiě) r讀 x執(zhí)行   w  2   r  4   x  1
    file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        return
    }
    defer file.Close()
    // 獲取writer對(duì)象
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        writer.WriteString("hello\n")
    }
    // 刷新緩沖區(qū),強(qiáng)制寫(xiě)出
    writer.Flush()
}
func re() {
    file, err := os.Open("./xxx.txt")
    if err != nil {
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        line, _, err := reader.ReadLine()
        if err == io.EOF {
            break
        }
        if err != nil {
            return
        }
        fmt.Println(string(line))
    }
}
func main() {
    re()
}

以上就是Go語(yǔ)言IO輸入輸出底層原理及文件操作API的詳細(xì)內(nèi)容,更多關(guān)于Go IO操作輸入輸出API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go?分布式鏈路追蹤實(shí)現(xiàn)原理解析

    Go?分布式鏈路追蹤實(shí)現(xiàn)原理解析

    分布式鏈路追蹤作為解決分布式應(yīng)用可觀測(cè)問(wèn)題的重要技術(shù),愈發(fā)成為分布式應(yīng)用不可缺少的基礎(chǔ)設(shè)施,本文將詳細(xì)介紹分布式鏈路的核心概念、架構(gòu)原理和相關(guān)開(kāi)源標(biāo)準(zhǔn)協(xié)議,并分享我們?cè)趯?shí)現(xiàn)無(wú)侵入 Go 采集 Sdk 方面的一些實(shí)踐,需要的朋友可以參考下
    2022-06-06
  • Golang配置解析神器go?viper使用詳解

    Golang配置解析神器go?viper使用詳解

    viper是一個(gè)很完善的Go項(xiàng)目配置解決方案,很多著名的開(kāi)源項(xiàng)目都在使用,比如Hugo,Docker都使用了該庫(kù),使用viper可以讓我們專(zhuān)注于自己的項(xiàng)目代碼,而不用自己寫(xiě)那些配置解析代碼,本文給大家介紹Golang配置解析神器go?viper使用,感興趣的朋友一起看看吧
    2022-05-05
  • go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析

    go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 一文帶你了解Go語(yǔ)言中的類(lèi)型斷言和類(lèi)型轉(zhuǎn)換

    一文帶你了解Go語(yǔ)言中的類(lèi)型斷言和類(lèi)型轉(zhuǎn)換

    在Go中,類(lèi)型斷言和類(lèi)型轉(zhuǎn)換是一個(gè)令人困惑的事情,他們似乎都在做同樣的事情。最明顯的不同點(diǎn)是他們具有不同的語(yǔ)法(variable.(type)?vs?type(variable)?)。本文我們就來(lái)深入研究一下二者的區(qū)別
    2022-09-09
  • 深入淺出Golang中select的實(shí)現(xiàn)原理

    深入淺出Golang中select的實(shí)現(xiàn)原理

    在go語(yǔ)言中,select語(yǔ)句就是用來(lái)監(jiān)聽(tīng)和channel有關(guān)的IO操作,當(dāng)IO操作發(fā)生時(shí),觸發(fā)相應(yīng)的case操作,有了select語(yǔ)句,可以實(shí)現(xiàn)main主線程與goroutine線程之間的互動(dòng)。本文就來(lái)詳細(xì)講講select的實(shí)現(xiàn)原理,需要的可以參考一下
    2022-08-08
  • Go語(yǔ)言提升開(kāi)發(fā)效率的語(yǔ)法糖技巧分享

    Go語(yǔ)言提升開(kāi)發(fā)效率的語(yǔ)法糖技巧分享

    每門(mén)語(yǔ)言都有自己的語(yǔ)法糖,像java的語(yǔ)法糖就有方法變長(zhǎng)參數(shù)、拆箱與裝箱、枚舉、for-each等等,Go語(yǔ)言也不例外。本文就來(lái)介紹一些Go語(yǔ)言的語(yǔ)法糖,需要的可以參考一下
    2022-07-07
  • golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式

    golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式

    這篇文章主要介紹了golang 刪除切片的某個(gè)元素及剔除切片內(nèi)的零值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 一文帶你了解Go語(yǔ)言中函數(shù)設(shè)計(jì)的實(shí)踐示例

    一文帶你了解Go語(yǔ)言中函數(shù)設(shè)計(jì)的實(shí)踐示例

    良好設(shè)計(jì)的函數(shù)具有清晰的職責(zé)和邏輯結(jié)構(gòu),提供準(zhǔn)確的命名和適當(dāng)?shù)膮?shù)控制,下面我們將一一描述函數(shù)設(shè)計(jì)時(shí)能夠遵循的最佳實(shí)踐,希望對(duì)大家有所幫助
    2023-06-06
  • GoLang與Java各自生成grpc代碼流程介紹

    GoLang與Java各自生成grpc代碼流程介紹

    這篇文章主要介紹了GoLang與Java各自生成grpc代碼流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-03-03
  • 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法

    一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法

    在 Golang 中,結(jié)構(gòu)體和方法是實(shí)現(xiàn)面向?qū)ο缶幊痰闹匾M成部分,也是 Golang 的核心概念之一。在本篇文章中,我們將深入介紹 Golang 結(jié)構(gòu)體與方法的概念、使用方法以及相關(guān)的編程技巧和最佳實(shí)踐
    2023-04-04

最新評(píng)論