golang学习笔记之-fmt.Println源码print.g

2019-02-07  本文已影响0人  Maggie_up

看下error接口

// error接口
type error interface {
    Error() string
}

实现error接口

package main

import "fmt"

type fileError struct {
}
//https://blog.csdn.net/Maggie_up有问题欢迎指正!
func (fe *fileError) Error() string {
    return "文件错误"
}

func main() {
    fmt.Println(&fileError{})
}
// 最后打印结果:文件错误

1.这是fmt.println函数在内部调用Error()方法
2.在源码fmt--->print.go这个文件中

//print.go 部分代码:
//Stringer接口
type Stringer interface {
    String() string
}

......
    switch v := p.arg.(type) {  //类型断言:error接口会调用Error()方法,Stringer接口会调用String()方法
            case error:
                handled = true
                defer p.catchPanic(p.arg, verb)
                p.fmtString(v.Error(), verb)
                return

            case Stringer:
                handled = true
                defer p.catchPanic(p.arg, verb)
                p.fmtString(v.String(), verb)
                return
            }                       

修改代码实现Stringer接口测试,看会不会调用String()方法:

package main

import "fmt"

type fileError struct {
}
//https://blog.csdn.net/Maggie_up有问题欢迎指正!
func (fe *fileError) String() string {
    return "字符串"
}

func main() {
    fmt.Println(&fileError{})
}
//打印:字符串  调用了String()方法

简单理解:fmt.Println会在内部调用Error()和String()方法,而且Error()方法有优先权。

上一篇下一篇

猜你喜欢

热点阅读