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)跑


    在这里插入图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 安装 官网下载地址:https://golang.org/dl/ ,根据系统平台下载对应资源包,安装或解压到对应目...
    鱼籽灬阅读 751评论 0 0
  • 第一章五个程序 都很好!但是初学编程/没有其他语言基础的不容易看懂。 记一遍不熟悉的东西: who = strin...
    暗黑破坏球嘿哈阅读 1,464评论 0 10
  • 一、数据类型转换 https://studygolang.com/articles/10838 package m...
    蓓蓓的万能男友阅读 1,110评论 0 1
  • 今天早上改了卷子,完成了天一卷子的分析。下午我们历史组在兀老师倡议下,去了平陆县的傅说祠,随后吃过晚饭,就步行去了...
    三门峡383何丽娜阅读 468评论 0 50
  • Android 系统在完成启动后,会发射一个ACTION_BOOT_COMPLETED的广播,并且这个广播只...
    Flyppy阅读 7,464评论 2 1