Golang学习中的点滴

48 阅读1分钟

作为一名初学者,在学习go中总会遇到一些小小的问题,为了强化学习随手将其做个笔记

1、errors包遇到的问题

package main

import (
   "fmt"
)

package errors

// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
   return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
   s string
}

func (e *errorString) Error() string {
   return e.s
}
上述代码是errors包中的代码

func main() {
   demo01 := New("这是测试一")
   fmt.Println(demo01)
   
   demo01是大部分时候的用法

   demo02 := New("这是测试二")   ------1
   fmt.Println(demo02.Error())  ------2
}

demo02是我觉得最为正常的用法,理由是:

1、第一步在调用New()函数的时候返回一个&errorString{text}实例,注意此处errorString结构体实现了error接口的方法,所以可以互相转换。

2、第二步在调用Error函数时候传进去一个实例,返回一个string,但是实际上两个返回的结果是一样的。

经过查阅资料发现,这是因为类型errorString实现了error接口的Error()方法,而在fmt.Println函数中,如果打印的变量实现了error接口,那么会自动调用该变量的Error()方法进行输出。所以在fmt.Println(a)时,虽然没有显式地调用Error()方法,但在底层仍然会隐式地调用该方法,从而输出与fmt.Println(b.Error())相同的结果。