本文实例分析了GO语io包的常用接口。分享给大家供大家参考。具体分析如下:
我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在 Golang 中非常迷糊,特别是文件的读写操作,因为 Go 的文件读写操作有很多的方法,让我不知道怎么选择。直到我学习了 interface 的概念,然后由看了 package io 后才慢慢理解,也渐渐的喜欢上了 Golang 的灵活性。以我的经验来说,接口是一个很重要的知识点,是一系列操作的规范,特别是公共接口尤为重要,如:package io
本文仅仅列举最常用的几个接口,如果您想系统的学习 io 接口,建议阅读底部参考链接。
一、IO 接口概述
package os 提供了对 I/O 原语的基本接口,使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。因为这些接口和原语是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发执行安全的。
在 package os 中最重要的是两个接口:Reader 和 Writer 接口。本章所提到的各种接口,都跟这两个接口有关,也就是说,只要实现了这两个接口,它就有了 IO 的功能。
小贴士:
var EOF = errors.New("EOF"): 在 package io中定义,使用非常频繁。正常情况下当 Read() 无法得到更多返回时就返回 EOF,即文件到达了结尾(end-of-file)。
二、io.Reader 和 io.Writer
定义:
type Reader interface { Read(p []byte) (n int, err error) }type Writer interface { Write(p []byte) (n int, err error) }
从接口名称很容易猜到,一般地,Go中接口的命名约定:接口名以er结尾。注意,这里并非强行要求,你完全可以不以 er 结尾。标准库中有些接口也不是以 er 结尾的。
示例:
func wr() { f, _ := os.Create("at.txt") defer f.Close() f.Write([]byte("Go是一种令人愉悦的编程语言")) //写入字节流 f.Seek(0, os.SEEK_SET) //将指针重置p := make([]byte, 2) // 读取 2 byte( len(buf)=2 ) if _, err := f.Read(p); err != nil { log.Fatal("[F]", err) } fmt.Printf("读取字符 \"%s\", 长度为 %d byte\n", p, len(p))
p = make([]byte, 50) if _, err := f.Read(p); err != nil { if err != io.EOF { //忽略 EOF 错误 log.Fatal("[F]", err) } } fmt.Printf("读取字符 \"%s\", 长度为 %d byte\n", p, len(p)) }
三、io.ReaderAt 和 os.WriterAt
定义(off 是 offset 的缩写):
type ReaderAt interface { ReadAt(p []byte, off int64) (n int, err error) }type WriterAt interface { WriteAt(p []byte, off int64) (n int, err error) }
示例:
func at() { f, _ := os.Create("at.txt") defer f.Close()f.WriteString("Go是一种令人愉悦的编程语言") f.WriteAt([]byte("程序"), 26) //偏移 26byte 改写“编程”->“程序”
fi, _ := f.Stat() //获取文件信息 p := make([]byte, fi.Size()-2) //文件大小减去偏移值 f.ReadAt(p, 2) //偏移 2 byte
os.Stdout.Write(p) }
四、io.ReaderFrom 和 os.WriterTo
定义:
type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error) }type WriterTo interface { WriteTo(w Writer) (n int64, err error) }
WriteTo() 将数据写入 w 中,直到没有数据可写或发生错误。返回写入的字节数和任何错误。
示例:
func fromTo() { r := strings.NewReader("Go是一种令人愉悦的编程语言") //创建一个 Reader w := bufio.NewWriter(os.Stdout) //创建一个 Writerw.ReadFrom(r) // w 一次性读取 r 的全部内容 w.Flush()
r.Seek(0, os.SEEK_SET) //重置指针
r.WriteTo(w) // r 一次性将内容写入 w 中 w.Flush() }
五、io.Seeker
定义:
type Seeker interface { Seek(offset int64, whence int) (ret int64, err error) }
whence的值,在os包中定义了相应的常量:
SEEK_SET int = 0 //从文件的起始处开始设置 offset SEEK_CUR int = 1 //从文件的指针的当前位置处开始设置 offset SEEK_END int = 2 //从文件的末尾处开始设置 offset
定义:
type Closer interface { Close() error }
七、其他
type ByteReader interface { ReadByte() (c byte, err error) }type RuneReader interface { ReadRune() (r rune, size int, err error) }
type ByteWriter interface { WriteByte(c byte) error }
参考:
https://gowalker.org/io
https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.1.md
希望本文所述对大家的GO语言程序设计有所帮助。
标准的Go语言代码库中包含了大量的包,并且在安装 Go 的时候多数会自动安装到系统中。我们可以在 $GOROOT/src/pkg 目录中查看这些包。下面简单介绍一些我们开发中常用的包。 1) fmt fmt 包实现了格式化的标准输入输出,这与C语言中的 printf 和 scanf 类似。其中的 fmt.Printf() 和 fmt.Println() 是开发者使用最为频繁的函数。 格式化短语派生
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 实例 /* 定义接口 */ type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type]
实际开发中,对于超出 int64 或者 uint64 类型的大数进行计算时,如果对精度没有要求,使用 float32 或者 float64 就可以胜任,但如果对精度有严格要求的时候,我们就不能使用浮点数了,因为浮点数在内存中只能被近似的表示。 Go语言中 math/big 包实现了大数字的多精度计算,支持 Int(有符号整数)、Rat(有理数)和 Float(浮点数)等数字类型。 这些类型可以实现
主要内容:iota 常量生成器,无类型常量Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。 常量的定义格式和变量的声明语法类似: ,例如: const pi = 3.14159 // 相当于 math.Pi 的近似值 在Go语言中,你可以省
常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式: const identifier [type] = value 你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。 显式类型定义: const b string = "abc" 隐式类型定义: const b = "abc
和 C 语言一样Go语言中的常量也分为整型常量、实型常量、字符常量、字符串常量、自定义常量 自定义常量 C 语言自定义常量:const 数据类型 常量名称 = 值; #include <stdio.h> int main(int argc, const char * argv[]) { const float PI = 998; PI = 110; //