go语言文件操作

trochiluses · · 2548 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

摘要: 本文主要讲解go语言的文件操作.系统底层的open\write等系统调用,往往操作的文件对象是文件描述符;而C语言库的文件操作需要借助fopen/fread等函数,它们的操作对象是文件指针.go语言中,对文件操作进行了进一步封装……

1.os包中File类

首先,file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。

type File struct {
    *file
}

type file struct {
    fd  int
    name string
    dirinfo *dirInfo
    nepipe  int
}

func (f *File) Fd( )uintptr{
    if f== nil{
        return ^(uintptr(0))
    }
    return uintptr(f.fd)
}

//注意,上文中为什么可以用f.fd这个语法,f是File,而File中没有成员?

func (f *File) Close() error{

}

func (f *File)Stat ()(fi FileInfo, err error){

}

同时File类还实现了如下方法:

func (f *File) read(b []byte) (n int, err error);
func (f *File) write(b []byte) (n int, err error) ;
func (f *File) seek(offset int64, whence int) (ret int64, err error) ;

2.io.ReadCloser

在go语言中,带有er后缀的往往是接口,ReadCloser顾名思义,就是包含Read和Close方法的借口。我们去看看这两个接口的定义和实现:

type Reader interface {
    Read(p []byte) (n int, err error)
}
type Closer interface {
    Close() error
}

注意:不同的包中对Reader的定义是不同的,下面是bufio中对Reader的定义

3. bufio package

type Reader struct {
    // contains filtered or unexported fields
}

type Reader struct {
            buf          []byte
            rd           io.Reader
            r, w         int
            err          error
            lastByte     int
            lastRuneSize int
}

bufio是带有缓冲的io读写包,我们先来看一个例子:

    package main
    import (
        "fmt"
        "os"
        "bufio"
        "io"
    )
    func main() {
        f, err := os.Open("c:\\aaa.txt")//打开文件
        defer f.Close() //打开文件出错处理
        if nil == err {
            buff := bufio.NewReader(f) //读入缓存
            for {
                line, err := buff.ReadString('\n') //以'\n'为结束符读入一行
                if err != nil || io.EOF == err {
                    break
                }
                fmt.Print(line)  //可以对一行进行处理
            }
        }
    }

func NewReader(rd io.Reader) *Reader
//NewReader returns a new Reader whose buffer has the default size.

4.实例

type Request struct {
    // The message body.
    ...
    Body io.ReadCloser
    ...
}

所以说,如果我们想实现Request中的Body,仅仅需要实现io package中的两个interface就可以了.


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:trochiluses

查看原文:go语言文件操作

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

2548 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传