zoukankan      html  css  js  c++  java
  • 解决一个问题(接上一篇博客)

      解决了前两天在实验楼做go错误处理实验发现的问题,刚开始以为跟接口有关,还为此把这个问题写到实验楼讲义、博客、后面又在segmentfault提问,以为解决了,然后昨天写了段代码验证一下结果出现了问题。

      这是之前的疑问: f2(42)返回一个&argError类型的值,但是,这个Error()方法是什么时候调用的?因为最后输出的是一个字符串。

      这是segmentfault的回答:f2 的第一个 return 的返回值有两个。其中第二值是一个指针,指向的是类(叫结构体也可以) argError 的一个实例对象。由于 argError 类实现了 Error 方法,按照 Golang 的 duck type 原则,这个类是 error 接口的实现。

      这是现在的理解:

      Error()方法的调用跟接口以及接口的实现没有关系,只是因为 fmt.println默认调用了Error()方法,因为Error方法是error接口内置方法。我后面把代码改了一下,加了一个方法之后发现无论如 何只实现Error方法,之后又把Error方法名字改掉,就只返回指针而不实现任何方法了。下面贴一段代码:

      package main

      import (

      "fmt"

      )

      type Areaer interface {

      Area() float64

      }

      type Rect struct {

      width, height float64

      }

      func (r *Rect) Area() float64 {

      return r.width * r.height

      }

      func NewRect(width, height float64) Areaer {

      return &Rect{width, height}

      }

      func main() {

      r := &Rect{5, 6}
      r1 := NewRect(10, 20)
    
      fmt.Println(r)
      fmt.Println(r1)

      }
      输出:&{5 6}

       &{10 20}
    

      由此可见,虽然也是返回了指针类型,但是没有调用对象的方法。(实验楼代码参见上一篇博客)

  • 相关阅读:
    加载页面遮挡耗时操作任务页面--第三方开源--AndroidProgressLayout
    【数据库】SQLite学习
    【数据库】MongoDB学习
    【英语】Bingo口语笔记(8)
    【英语】TED视频笔记
    自动关联
    HTML和URL比较
    LR回放测试脚本
    LR录制脚本IE不能打开解决方法
    LR录制测试脚本
  • 原文地址:https://www.cnblogs.com/Ellon-Daris/p/5514618.html
Copyright © 2011-2022 走看看