如何解决编写代码时出现的Go问题 - 编程语言

博主:xiaoweixiaowei 2023-01-18 条评论

这篇文章主要介绍“如何解决编写代码时出现的Go问题”,在日常操作中,相信很多人在如何解决编写代码时出现的Go问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决编写代码时出现的Go问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

案例一

代码示例如下:

type MyErr struct {     Msg string }  func main() {     var e error     e = GetErr()     log.Println(e == nil) }  func GetErr() *MyErr {     return nil }  func (m *MyErr) Error() string {     return "脑子进煎鱼了" }

请思考一下,这段程序的输出结果是什么?

该程序所调用的 GetErr 方法所返回的是 nil,而外部判断是 e == nil,因此最终的输出结果是 true,对吗?

输出结果如下:

2021/04/04 08:39:04 false

答案是:false。

案例二

代码示例如下:

type Base interface {     do() }  type App struct { }  func main() {     var base Base     base = GetApp()          log.Println(base)     log.Println(base == nil) }  func GetApp() *App {     return nil } func (a *App) do() {}

请思考一下,这段程序的输出结果是什么?

该程序调用了 GetApp 方法,该方法返回的是 nil,因此其赋值的 base 也是 nil。因此判断 base == nil 的最终输出结果是和 true,对吗?

输出结果如下:

2021/04/04 08:59:00 <nil> 2021/04/04 08:59:00 false

答案是:和 false。

为什么

为什么,这两段 Go 程序是怎么回事…也太反直觉了?其背后的原因本质上还是对 Go 语言中 interface 的基本原理的理解。

在案例一中,虽然 GetErr 方法确实是返回了 nil,返回的类型也是具体的 *MyErr 类型。但是其接收的变量却不是具体的结构类型,而是 error  类型:

var e error e = GetErr()

在 Go 语言中, error 类型本质上是 interface:

如何解决编写代码时出现的Go问题 - 编程语言
type error interface {     Error() string }

因此兜兜转转又回到了 interface 类型的问题,interface 不是单纯的值,而是分为类型和值。

所以传统认知的此 nil 并非彼 nil,必须得类型和值同时都为 nil 的情况下,interface 的 nil 判断才会为 true。

在案例一中,结合代码逻辑,更符合场景的是:

var e *MyErr e = GetErr() log.Println(e == nil)

输出结果就会是 true。

在案例二中,也是一样的结果,原因也是 interface。不管是 error  接口(interface),还是自定义的接口,背后原理一致,自然也就结果一致了。

到此,关于“如何解决编写代码时出现的Go问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云网站,小编会继续努力为大家带来更多实用的文章!

The End

发布于:2023-01-18,除非注明,否则均为 主机评测原创文章,转载请注明出处。