Contents

go标准库-Os+io+bufio+ioutil

go语言中文网

godoc

go语言中文网有很多文档缺少内容比如string.Builder就没有,godoc绝对详尽,推荐阅读godoc

os

常量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var (
    Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
    Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
    Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

var (
    ErrInvalid    = errors.New("invalid argument")
    ErrPermission = errors.New("permission denied")
    ErrExist      = errors.New("file already exists")
    ErrNotExist   = errors.New("file does not exist")
)

函数

  • func Exit(code int):让当前程序以给出的状态码code退出。
  • func Getuid() int:返回调用者的用户ID。
  • func Getwd() (dir string, err error):Getwd返回一个对应当前工作目录的根路径。如果当前目录可以经过多条路径抵达(因为硬链接),Getwd会返回其中一个。
  • func Chdir(dir string) error:Chdir将当前工作目录修改为dir指定的目录。

type FileInfo interface

方法

1
2
3
4
5
6
7
8
type FileInfo interface {
    Name() string       // 文件的名字(不含扩展名)
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{}   // 底层数据来源(可以返回nil)
}

函数

  • func Stat(name string) (fi FileInfo, err error):Stat返回一个描述name指定的文件对象的FileInfo。对于符号连接会自动跳转,出错返回PathError
  • func Lstat(name string) (fi FileInfo, err error):和Stat一样但是不跳转

type File struct

函数

  • func Create(name string) (file *File, err error):采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)

  • func Open(name string) (file *File, err error):Open打开一个文件用于读取,底层也是调用OpenFile。

  • func OpenFile(name string, flag int, perm FileMode) (file *File, err error):指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件,模式参数用于创建不存在的文件时指定其模式,对于读取和写入可以直接传入0

  • func NewFile(fd uintptr, name string) *File

  • func Mkdir(name string, perm FileMode) error:使用指定的权限和名称创建一个目录

  • func Rename(oldpath, newpath string) error:修改一个文件的名字,移动一个文件

方法

  • func (f *File) Read(b []byte) (n int, err error):ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。到达文件结尾,返回值err会是io.EOF。
  • func (f *File) Write(b []byte) (n int, err error):Write向文件中写入len(b)字节数据。
  • func (f *File) WriteString(s string) (ret int, err error):写入字符串
  • func (f *File) Seek(offset int64, whence int) (ret int64, err error):设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
  • func (f *File) Close() error:关闭文件,通常与defer一起使用

type Process struct

Process保管一个被StarProcess创建的进程的信息。

变量

1
2
3
4
type Process struct {
    Pid int
    // 内含隐藏或非导出字段
}

函数

  • func FindProcess(pid int) (p *Process, err error):根据进程id查找一个运行中的进程。
  • func (p *Process) Signal(sig Signal) error:向进程发送一个信号。
  • func (p *Process) Kill() error:让进程立刻退出
  • func (p *Process) Wait() (*ProcessState, error):阻塞执行主进程直到该参数进程退出

user

user包允许通过名称或ID查询用户帐户

函数

  • func Current() (*User, error):返回当前的用户帐户
  • func Lookup(username string) (*User, error):根据用户名查询用户
  • func LookupId(uid string) (*User, error):根据用户ID查询用户

type User struct

1
2
3
4
5
6
7
type User struct {
    Uid      string // 用户ID
    Gid      string // 初级组ID
    Username string
    Name     string
    HomeDir  string
}

type UnknownUserError string

当找不到用户时,Lookup会返回UnknownUserError

方法

  • func (e UnknownUserError) Error() string

type UnknownUserIdError int

当找不到用户时,LookupId会返回UnknownUserIdError

方法

  • func (e UnknownUserIdError) Error() string

exec

exec包执行外部命令。它包装了os.StartProcess函数以便更容易的修正输入和输出,使用管道连接I/O,以及作其它的一些调整

变量

  • var ErrNotFound = errors.New(“executable file not found in $PATH”)

函数

  • func LookPath(file string) (string, error):在环境变量PATH指定的目录中搜索可执行文件,如file中有斜杠,则只在当前目录搜索。返回完整路径或者相对于当前目录的一个相对路径
  • func Command(name string, arg …string) Cmd:函数返回一个Cmd,用于使用给出的参数执行name指定的程序。返回值只设定了Path和Args两个参数。如果name不含路径分隔符,将使用LookPath获取完整路径

type Error struct

1
2
3
4
type Error struct {
    Name string
    Err  error
}

Error类型记录执行失败的程序名和失败的原因

方法

  • func (e *Error) Error() string

type ExitError struct

1
2
3
type ExitError struct {
    *os.ProcessState
}

ExitError报告某个命令的一次未成功的返回

方法

  • func (e *ExitError) Error() string

type Cmd struct

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type Cmd struct {
    // Path是将要执行的命令的路径。
    //
    // 该字段不能为空,如为相对路径会相对于Dir字段。
    Path string
    // Args保管命令的参数,包括命令名作为第一个参数;如果为空切片或者nil,相当于无参数命令。
    //
    // 典型用法下,Path和Args都应被Command函数设定。
    Args []string
    // Env指定进程的环境,如为nil,则是在当前进程的环境下执行。
    Env []string
    // Dir指定命令的工作目录。如为空字符串,会在调用者的进程当前目录下执行。
    Dir string
    // Stdin指定进程的标准输入,如为nil,进程会从空设备读取(os.DevNull)
    Stdin io.Reader
    // Stdout和Stderr指定进程的标准输出和标准错误输出。
    //
    // 如果任一个为nil,Run方法会将对应的文件描述符关联到空设备(os.DevNull)
    //
    // 如果两个字段相同,同一时间最多有一个线程可以写入。
    Stdout io.Writer
    Stderr io.Writer
    // ExtraFiles指定额外被新进程继承的已打开文件流,不包括标准输入、标准输出、标准错误输出。
    // 如果本字段非nil,entry i会变成文件描述符3+i。
    //
    // BUG: 在OS X 10.6系统中,子进程可能会继承不期望的文件描述符。
    // http://golang.org/issue/2603
    ExtraFiles []*os.File
    // SysProcAttr保管可选的、各操作系统特定的sys执行属性。
    // Run方法会将它作为os.ProcAttr的Sys字段传递给os.StartProcess函数。
    SysProcAttr *syscall.SysProcAttr
    // Process是底层的,只执行一次的进程。
    Process *os.Process
    // ProcessState包含一个已经存在的进程的信息,只有在调用Wait或Run后才可用。
    ProcessState *os.ProcessState
    // 内含隐藏或非导出字段
}

Cmd代表一个正在准备或者在执行中的外部命令

方法

  • func (c *Cmd) StdinPipe() (io.WriteCloser, error):StdinPipe方法返回一个在命令Start后与命令标准输入关联的管道
  • func (c *Cmd) StdoutPipe() (io.ReadCloser, error):StdoutPipe方法返回一个在命令Start后与命令标准输出关联的管道
  • func (c *Cmd) StderrPipe() (io.ReadCloser, error):StderrPipe方法返回一个在命令Start后与命令标准错误输出关联的管道
  • func (c Cmd) Run() error:Run执行c包含的命令,并阻塞直到完成。如果命令成功执行,stdin、stdout、stderr的转交没有问题,并且返回状态码为0,方法的返回值为nil;如果命令没有执行或者执行失败,会返回ExitError类型的错误;否则返回的error可能是表示I/O问题
  • func (c *Cmd) Start() error:Start开始执行c包含的命令,但并不会等待该命令完成即返回。Wait方法会返回命令的返回状态码并在命令返回后释放相关的资源
  • func (c *Cmd) Wait() error:Wait会阻塞直到该命令执行完成,该命令必须是被Start方法开始执行的。Wait方法会在命令返回后释放相关的资源
  • func (c *Cmd) Output() ([]byte, error):执行命令并返回标准输出的切片
  • func (c *Cmd) CombinedOutput() ([]byte, error):执行命令并返回标准输出和错误输出合并的切片

signal

signal包实现了对输入信号的访问

函数

  • func Notify(c chan<- os.Signal, sig …os.Signal):将输入信号转发到c,c至少缓存1,可以使用对一个chan执行多次Notify
  • func Stop(c chan<- os.Signal):停止向c发送信号,取消c上所有Notify的效果

io

io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。

变量

1
var EOF = errors.New("EOF")

函数

  • func Copy(dst Writer, src Reader) (written int64, err error):将src的数据拷贝到dst,直到在src上到达EOF或发生错误
  • func CopyN(dst Writer, src Reader, n int64) (written int64, err error):从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误

io/ioutil

函数

  • func ReadAll(r io.Reader) ([]byte, error):从r读取数据直到EOF或遇到error

bufio

bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象

常量

1
2
3
4
const (
    // 用于缓冲一个token,实际需要的最大token尺寸可能小一些,例如缓冲中需要保存一整行内容
    MaxScanTokenSize = 64 * 1024
)

type Reader struct

函数

  • func NewReader(rd io.Reader) Reader:创建一个具有默认大小缓冲、从r读取的Reader
  • func NewReaderSize(rd io.Reader, size int) Reader:创建一个具有最少有size尺寸的缓冲、从r读取的Reader。如果参数r已经是一个具有足够大缓冲的* Reader类型值,会返回r

方法

  • func (b *Reader) Reset(r io.Reader):丢弃缓冲中的数据,清除任何错误,将b重设为其下层从r读取数据
  • func (b *Reader) Buffered() int:返回缓冲中现有的可读取的字节数
  • func (b *Reader) Peek(n int) ([]byte, error):返回输入流的下n个字节,而不会移动读取位置
  • func (b *Reader) Read(p []byte) (n int, err error):读取数据写入p
  • func (b *Reader) ReadByte() (c byte, err error):读取并返回一个字节
  • func (b *Reader) ReadRune() (r rune, size int, err error):读取一个utf-8编码的unicode码值,返回该码值、其编码长度和可能的错误
  • func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error):这个函数容易出错,使用ReadBytes(’\n’)或ReadString(’\n’)代替,或者使用Scanner
  • func (b *Reader) ReadBytes(delim byte) (line []byte, err error):ReadBytes读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的切片
  • func (b *Reader) ReadString(delim byte) (line string, err error):ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串

type Writer struct

内容基本与Reader一一对应

函数

  • func NewWriter(w io.Writer) Writer:创建一个具有默认大小缓冲、写入w的Writer。
  • func NewWriterSize(w io.Writer, size int) Writer:创建一个具有最少有size尺寸的缓冲、写入w的Writer。如果参数w已经是一个具有足够大缓冲的*Writer类型值,会返回w。

方法

  • func (b *Writer) Reset(w io.Writer):丢弃缓冲中的数据,清除任何错误,将b重设为将其输出写入w。
  • func (b *Writer) Buffered() int:返回缓冲中已使用的字节数
  • func (b *Writer) Available() int:返回缓冲中还有多少字节未使用
  • func (b *Writer) Write(p []byte) (nn int, err error):将p的内容写入缓冲
  • func (b *Writer) WriteString(s string) (int, error):写入一个字符串。
  • func (b *Writer) WriteByte(c byte) error:写入单个字节
  • func (b *Writer) WriteRune(r rune) (size int, err error):写入一个unicode码值(的utf-8编码),返回写入的字节数和可能的错误
  • func (b *Writer) Flush() error:将缓冲中的数据写入下层的io.Writer接口

type ReadWriter struct

变量

1
2
3
4
type ReadWriter struct {
    *Reader
    *Writer
}

所以其实没有必要使用这个,直接弄一个Reader和Writer就行了

type Scanner struct

推荐使用Reader

重定向输入输出

CSDN Golang重定向fmt.Scanf从文件而不是os.Stdin读取

直接给os.Stdin赋值新的file对象,记得备份原来的Stdin

1
2
oldStdin := os.Stdin
os.Stdin = f
 |