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 条评论) “” |