go语言常用系统接口

go语言有三大常用的系统接口,Stringer,Reader,Writer。

Stringer接口

Stringer接口包含了String方法,它的作用和java的toString一样,我们在打印重写了String方法这个对象的时候,会打印出返回的string值。代码如下:

type SmallDuck struct {
   Foot int
}
func (smallDuck SmallDuck) String() string {
	return fmt.Sprintf("foot is %d", smallDuck.Foot)
}

定义一个结构体SmallDuck,它重写了String方法。

具体的调用:

func main() {
   var uglyDuckling UglyDuckling
   uglyDuckling = yellow.SmallDuck{Foot: 2}
   fmt.Printf("%T %v 
", uglyDuckling, uglyDuckling)
}

结果如下:

yellow.SmallDuck foot is 2 

输出的SamllDuck的value为自定义的内容,即String方法返回的值。

Writer接口

type Writer interface {
   Write(p []byte) (n int, err error)
}

go语言的Writer接口定义了一个Write方法,当实现者为文件的时候,通过Write方法可以将byte数组里面内容write进入文件当中。

Reader接口

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

Reader接口定义了一个Read方法,当实现者为文件的时候,通过Read方法可以将文件里面的内容写进byte数组当中。除了文件实现了Reader接口和Writer接口外,byte数组,byte切片,网络流相关的也实现了Reader接口。因此,涉及到读写底层的东西,我们传入的是Writer和Reader接口,而不是File。例如fmt包的Fprintf方法和Fscanf方法

func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
   p := newPrinter()
   p.doPrintf(format, a)
   n, err = w.Write(p.buf)
   p.free()
   return
}
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error) {
	s, old := newScanState(r, false, false)
	n, err = s.doScanf(format, a)
	s.free(old)
	return
}

具体的Reader操作例子

定义读取Reader里面内容的方法

func printContents(reader io.Reader) {
   scanner := bufio.NewScanner(reader)
   for scanner.Scan() {
      fmt.Println(scanner.Text())
   }
}

具体调用

func main() {
   s := `1
        12!!!`
   printContents(strings.NewReader(s))
}

通过``定义一个跨行的字符串,通过string.NewReader()方法将s转为Reader类型,然后调用定义的方法,通过Scanner读取字符打印在控制台上。

打印的结果为

1
        12!!!

除了Reader和Writer外,还有组合它们的接口ReadWriter

type ReadWriter interface {
   Reader
   Writer
}

实现者只要实现方法即可,具体的组合和调用由使用者决定。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章