• <nav id="26o4m"><source id="26o4m"></source></nav>
  • 我的Go+语言初体验——使用Go+读写文件经验总结

    CodecGuard 2021-12-11 22:14:55

    “我的Go+语言初体验” | 征文活动进行中......

    ?

    目录

    ?

    前言?

    正文

    读文件

    os.ReadFile

    io.ReadAtLeast

    bufio.NewReader

    写文件

    os.WriteFile

    File.Write

    bufio.WriteString


    前言?

    Go+ 是一门融合工程开发的 Go、数据科学领域的 Python、编程教学领域的 Scratch,以 Python 之形结合 Go 之心,让工程师处理数据不需要学习新的开发语言,让初学者学习编程、开发作品的门槛更低的编程语言。

    正文

    读文件和写文件是所有编程语言必须支持的基础操作,同样,Go+ 也不例外。Go+ 提供了非常丰富的读文件和写文件的基础库。今天我们就来了解一下这部分内容。

    读文件

    首先,我们介绍一下 Go+ 读文件的一些常用方法。

    os.ReadFile

    os.ReadFile 方法是用来读取文件信息最常用的方法,原理是将文件的全部内容都读取到内存中,示例代码如下:

    import (
    ? ? "bufio"
    ? ? "io"
    ? ? "os"
    )
    ?
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    // 首先创建一个文件,并向其中写入内容
    d1 := []byte("hello\nworld\n")
    err := os.WriteFile("/tmp/f1", d1, 0644)
    ?
    dat, err := os.ReadFile("/tmp/f1")
    check(err)
    print(string(dat))

    执行结果:

    hello
    world

    亲自试一试!

    io.ReadAtLeast

    io.ReadAtLeast 方法从文件中读取最少字节数到内存中,示例代码如下:

    import (
    ? ? "bufio"
    ? ? "io"
    ? ? "os"
    )
    ?
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    // 首先创建一个文件,并向其中写入内容
    d1 := []byte("hello\nworld\n")
    err := os.WriteFile("/tmp/f1", d1, 0644)
    ?
    dat, err := os.ReadFile("/tmp/f1")
    check(err)
    print(string(dat))
    ?
    f, err := os.Open("/tmp/f1")
    check(err)
    ?
    // 偏移6个字节
    o3, err := f.Seek(6, 0)
    check(err)
    b3 := make([]byte, 2)
    n3, err := io.ReadAtLeast(f, b3, 2)
    check(err)
    printf("%d bytes @ %d: %s\n", n3, o3, string(b3))

    执行结果:

    hello
    world
    2 bytes @ 6: wo

    亲自试一试!

    bufio.NewReader

    bufio.NewReader 方法是一个缓冲读取器,该读取器对于少量数据的读取非常方便。示例代码如下:

    import (
    ? ? "bufio"
    ? ? "io"
    ? ? "os"
    )
    ?
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    // 首先创建一个文件,并向其中写入内容
    d1 := []byte("hello\nworld\n")
    err := os.WriteFile("/tmp/f1", d1, 0644)
    ?
    dat, err := os.ReadFile("/tmp/f1")
    check(err)
    print(string(dat))
    ?
    f, err := os.Open("/tmp/f1")
    check(err)
    ?
    r4 := bufio.NewReader(f)
    b4, err := r4.Peek(5)
    check(err)
    printf("5 bytes: %s\n", string(b4))

    执行结果:

    hello
    world
    5 bytes: hello

    亲自试一试!

    写文件

    os.WriteFile

    首先,我们来看如何将字节数组写入文件,示例代码如下:

    import (
    ? ? "bufio"
    ? ? "os"
    )
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    d1 := []byte("hello\nworld\n")
    err := os.WriteFile("/tmp/f1", d1, 0644)
    check(err)

    执行完毕后,没有触发 panic,说明程序执行成功啦。但是不够直观,我们把文件内容读一下再打印出来,进而佐证我们的推断,示例代码:

    import (
    ? ? "bufio"
    ? ? "os"
    )
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    d1 := []byte("hello\nworld\n")
    err := os.WriteFile("/tmp/f1", d1, 0644)
    check(err)
    ?
    dat, err := os.ReadFile("/tmp/f1")
    check(err)
    print(string(dat))

    执行结果:

    hello
    world

    从执行结果可以知道我们的推断是正确的,程序没有问题。

    亲自试一试!

    File.Write

    写文件还有一种思路,就是首先创建或者打开一个文件,再向其中写入内容信息,示例代码如下:

    import (
    ? ? "bufio"
    ? ? "os"
    )
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    f, err := os.Create("/tmp/f2")
    check(err)
    ?
    // 打开文件后,defer 关闭文件属于常规做法
    defer f.Close()
    ?
    d2 := []byte{1, 222, 66, 88, 10, 102}
    n2, err := f.Write(d2)
    check(err)
    printf("wrote %d bytes\n", n2)
    ?
    n3, err := f.WriteString("gop is go+\n")
    check(err)
    printf("wrote %d bytes\n", n3)
    ?
    // 保证文件内容存入磁盘
    f.Sync()

    执行结果:

    wrote 6 bytes
    wrote 11 bytes

    亲自试一试!

    bufio.WriteString

    bufio 包也提供了缓冲写卡器,可以用来写文件,示例代码如下:

    import (
    ? ? "bufio"
    ? ? "os"
    )
    func check(e error) {
    ? ? if e != nil {
    ? ? ? ? panic(e)
    ? ? }
    }
    ?
    f, err := os.Create("/tmp/f1")
    check(err)
    ?
    // 打开文件后,defer 关闭文件属于常规做法
    defer f.Close()
    ?
    w := bufio.NewWriter(f)
    n4, err := w.WriteString("use bufio package write data\n")
    check(err)
    printf("wrote %d bytes\n", n4)
    ?
    // 保证缓存数据生效
    w.Flush()

    执行结果:

    wrote 29 bytes

    亲自试一试!
    ?

    ?

    “我的Go+语言初体验” | 征文活动进行中......

    ...全文
    177 1 4 打赏 收藏 举报
    写回复
    1 条回复
    切换为时间正序
    请发表友善的回复…
    发表回复
    白雪冬 3天前

    学习到了

    • 打赏
    • 举报
    回复
    相关推荐
    发帖
    Go+ 开发者社区
    创建于2021-11-16

    524

    社区成员

    Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。 Go+ 官网:https://goplus.org/
    帖子事件
    创建了帖子
    2021-12-11 22:14
    社区公告

    本社区为 Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。

    Go+ 官网:https://goplus.org/
    GitHub地址:https://github.com/goplus/gop

    天天躁夜夜躁狠狠综合2020,日本二区三区欧美亚洲国,自拍另类欧美图区视频一区,青青草国产免费无码