美文网首页
golang学习笔记之-fmt.Println源码print.g

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

作者: Maggie_up | 来源:发表于2019-02-07 14:28 被阅读0次

    看下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{})
    }
    // 最后打印结果:文件错误
    
    • 实现了接口,并没有调用Error()方法为什么会调用呢?尼玛不是要初始化结构体,再调用方法?这里一看代码木有调用啊,只初始化了下而已。怎么自动调用了?

    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()方法有优先权。

    • 可以debug模式调试下,不想看详细的按F8(详细按F7)跑


      在这里插入图片描述

    相关文章

      网友评论

          本文标题:golang学习笔记之-fmt.Println源码print.g

          本文链接:https://www.haomeiwen.com/subject/wfgwsqtx.html