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)跑
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Maggie_up/article/details/86771529
今日推荐