GO学习笔记(11)-3个重要的系统接口Stringer 与Reader与Wirter

112 阅读1分钟

Stringer接口

相当于toString的功能

  • 源码
// print.go
type Stringer interface {
	String() string
}
  • 例子
package mock
import "fmt"

type Receiver struct {
	Contents string
}

func (r *Receiver) String() string  {
	return fmt.Sprintf("Receiver:{Contesnts=%s}:",r.Contents)
}

func main() {
	//var r mock.Receiver
	r := Receiver{"This is a test for toString"}
	println(r.String())
}

Reader

相当于读文件或读io操作

  • 源码
// io.go
type Reader interface {
	Read(p []byte) (n int, err error)
}
  • 示例

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strings"
)

func printFile(filename string)  {
	file, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	printFileContents(file)
}

func printFileContents(reader io.Reader)  {
	scanner := bufio.NewScanner(reader)

	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}


func main() {
	printFile("./file/my.txt")

	s := `aaa"d"
		kkk
		p
		123456`
	//将字符串转为reader
	printFileContents(strings.NewReader(s))
}
  • my.txt文件内容
this is a test
my name is liping
中文

Writer

相当于往文件等io操作里写内容

  • 源码
// io.go
type Writer interface {
	Writer(p []byte) (n int, err error)
}
  • 示例

import (
	"bufio"
	"fmt"
	"io"
	"os"
)
func writerFile(filename string, content string)  {
	f, err := os.OpenFile(filename,os.O_APPEND,0764)
	defer f.Close()
	if err != nil{
		fmt.Println("文件不存在,正在创建文件")
		f,_ = os.Create(filename)
		//panic(err)
	}
	writerFileContent(f,content)

}


func writerFileContent(writer *os.File, content string)  {
	defer writer.Close()

	fmt.Println("文件打开成功")
	//打印字节
	writer.Write([]byte(content))
	//字印字符串
	writer.WriteString(content)
}

func main() {
	writerFile("./file/my.txt","要写入的内容1\r\n要写入的内容2\r\n\t要写入的内容3\r\n")
}