13-文件操作+
13 文件操作原文:文件操作 本文主要介绍了Go语言中文件读写的相关操作。 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。 13.1 打开和关闭文件os.Open() 函数能够打开一个文件,返回一个 *File 和一个 err。对得到的文件实例调用close() 方法能够关闭文件。 123456789101112131415161718package mainimport ( "fmt" "os")func main() { // 只读方式打开当前目录下的main.go文件 file, err := os.Open("./main.go") if err != nil { fmt.Println("open file failed!, err:", err) return } // 关闭文件 file.Close()} 为了防止文件忘记关闭,我们通常使用 defer 注册文件关闭语句。 13.2 读取...
2.io.go_reader接口
按照惯例,还是先从第一个方法(接口)看起吧。 123type Reader interface { Read(p []byte) (n int, err error)} 第一个是接口,其实在io的操作里面,Reader和Write是必不可少的东西,可是如此一来,这个接口是在哪里实现的呢?在网上,我找到一个例子。 1234567891011121314151617func main() { data, err := ReadFrom(strings.NewReader("from string"), 12) fmt.Println(data) fmt.Println(err)}func ReadFrom(reader io.Reader, num int) ([]byte, error) { p := make([]byte, num) n, err := reader.Read(p) if n > 0 { return p[:n], nil } return p, err...
3.io.go_write&Closer接口
首先,strings包里面的reader.go文件并没有write(有WriteTo),所以我们需要到别的地方去找这个接口的实现。最简单的就是文件操作的代码里面了,因为涉及到文件必然有写的操作。所以我们在os包的file.go文件里找到了它的实现: 12345678910111213141516171819func (f *File) Write(b []byte) (n int, err error) { if err := f.checkValid("write"); err != nil { return 0, err } n, e := f.write(b) if n < 0 { n = 0 } if n != len(b) { err = io.ErrShortWrite } epipecheck(f, e) if e != nil { err = &PathError{"write", f.name, e}...
4.io.go_ReaderWrite接口&其它
12345678910111213141516171819202122232425262728293031323334353637383940414243// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}// ReadCloser is the interface that groups the basic Read and Close methods.type ReadCloser interface { Reader Closer}// WriteCloser is the interface that groups the basic Write and Close methods.type WriteCloser interface { Writer Closer}// ReadWriteCloser is the interfa...
5.io.ReaderFrom接口
*这是在生病前更新的最后一篇,时隔近2月有余,已经忘得差不多了,现在重新从这一节开始整理边看边补吧。2017-9-23 ReaderFrom接口在bufio包的bufio.go中有实现,bufio是什么意思?一看名字可以猜得出,是带了buffer缓存的io包。通俗地来讲,就是io的威力加强版。 可见,io就是一个简单的小骨架,他是开枝散叶的,散布于各方法之中,由其调用。 先看一段实现的方法: 1234567func main() { b := bytes.NewBuffer(make([]byte, 10)) s := strings.NewReader("Hello world!") bw := bufio.NewWriter(b) bw.ReadFrom(s) fmt.Println(b)} 输出: 1Hello world! 这里我们先不用深究bufio是怎么用的,strings.NewReader是将“hello world”这个字符串转换成Reader的结构体。 12345type Reader struct...
io
概述IO是操作系统的基础概念,是对输入输出设备的抽象。Go语言的io库对这些功能进行了抽象,通过统一的接口对输入输出设备进行操作。 ReaderReader对象是对输入设备的抽象,一个Reader可以绑定到一个输入对象,并在这个输入设备上读取数据,其声明如下: 123type Reader interface { Read(p []byte) (n int, err error)} 除了基础的Reader类之外,io包中还有LimitReader,MultiReader和TeeReader。其中LimitReader只读取指定长度的数据;MultiReader用于聚合多个Reader,并依次进行读取;TeeReader将一个输入绑定到一个输出。具体声明如下: 12345func LimitReader(r Reader, n int64) Readerfunc MultiReader(readers ...Reader) Readerfunc TeeReader(r Reader, w Writer) Reader 这些衍生Reader都以包装的方式进行...
path
概述path包提供了许多辅助函数来处理UNIX系统文件路径, 辅助函数一个unix文件路径有如下格式<DirName>/<BaseName>分别对应于目录路径和基础路径,当这个路径表示一个文件时,BaseName就对应于文件名。 其中Base函数获取一个路径的BaseName,Dir函数获取一个路径的DirName;具体函数声明如下: 123func Base(path string) stringfunc Dir(path string) string 在UNIX文件系统中,一个完整文件名由文件名和文件后缀组成,比如.go,.c;Ext函数可以用于获取路径中的后缀名。 1func Ext(path string) string 对于一个目录和文件还有绝对路径和相对路径的概念,绝对路径就是从根目录开始的完整路径,比如/a/b/c;相对路径就是相对于当前目录的路径,比如a/b/c,../a/b/c。使用IsAbs可以判断一个路径是否是绝对路径;具体函数声明如下: 1func IsAbs(path string) bool 最后,path包还提供了两个函数用于...
ioutil
概述前面的io包提供了对输入输出设备最基本的抽象,而ioutil在io包的基础上提供了一系列的函数来应对具体的场景。 数据读取ioutil一共提供了三个数据读取的函数,分别是: ReadAll,从一个io.Reader读取所有数据,并返回一个字节数组 ReadllDir,从一个目录读取数据,并得到这个目录里的文件对象列表 ReadFile,读取指定文件的内容,并返回一个字节数组 其函数声明如下: 12345func ReadAll(r io.Reader) ([]byte, error)func ReadDir(dirname string) ([]os.FileInfo, error)func ReadFile(filename string) ([]byte, error) 可以看到上面的三个函数分别对应于三个特定的场景,下面以ReadFile为例对其使用进行说明 12345678910111213141516package mainimport ( "fmt" "io/ioutil")func main() &...
filepath
概述filepath包的功能和path包类似,但是对于不同操作系统提供了更好的支持。filepath包能够自动的根据不同的操作系统文件路径进行转换,所以如果你有跨平台的需求,你需要使用filepath。 与path包相同的函数filepath包中的函数和path包很类似,其中对应函数的功能相同,只是一个可以跨平台,一个不能,所以这里不详细展开,可以从 path 中获取这些函数的详细说明。主要函数如下: func Base(path string) string func Dir(path string) string func Ext(path string) string func Join(elem …string) string func Split(path string) (dir, file string) 其他函数剩下的还有两个函数值得一说,一个是Abs函数,可以将一个文件路径转换为绝对路径。函数声明如下: 1func Abs(path string) (string, error) 另一个是Walk函数,和filepath包中的其他函数不同,它并不对文件路径...
16-反射
16 反射基于 Go语言基础之反射 和视频内容整理 16.1 变量的内在机制Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息。 值信息:程序运行过程中可动态变化的。 16.2 反射介绍反射是指在程序运行期对程序本身进行访问和修改的能力。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go程序在运行期使用 reflect 包访问程序的反射信息。 在之前章节中我们介绍了空接口。 空接口可以存储任意类型的变量,那我们如何知道这个空接口保存的数据是什么呢? 反射就是在运行时动态的获取一个变量的类型信息和值信息。 16.3 reflect包在 Go 语言的反射机制中,任何接口值都由是一个具体类型和具体类型的值两部分组成的(我们在上一篇接口的博客中有介绍相关概念)。 在 Go 语言中反射的相关功能由内置的 refl...













