golang学习笔记之-fmt.Println源码print.go简单探索

看下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.go简单探索)