• go语言规范之方法集


    Go语言规范里定义的方法集的规则

    Values        Methods Receivers
    -----------------------------------------------
      T          (t T)
      *T          (t T) and (t *T)
    

    T类型的值的方法集只包含值接收者声明的方法。而指向T类型的指针的方法集既包含值接收者声明的方法,也包含指针接收者声明的方法。

    从接收者类型的角度来看方法集

    Methods Receivers   Values 
    -----------------------------------------------
      (t T)         T and *T
      (t *T)         *T
    

    如果使用指针接收者来实现一个接口,那么只有指向那个类型的指针才能够实现对应的接口。如果使用值接收者来实现一个接口,那么那个类型的值和指针都能够实现对应的接口。

    package main
    
    import "fmt"
    
    type duration int64
    
    func (d *duration) pretty() string  {
    	return fmt.Sprintf("Duration:%d",*d)
    }
    
    func main() {
    	duration(24).pretty()
    }
    
    

    上面的代码会出错

    goinaction/listing46.go:12:14: cannot call pointer method on duration(24)
    goinaction/listing46.go:12:14: cannot take the address of duration(24)
    

    修改为下方即可

    
    package main
    
    import "fmt"
    
    type duration int64
    
    func (d *duration) pretty() string  {
    	return fmt.Sprintf("Duration:%d",*d)
    }
    
    func main() {
    	s:=duration(24)
    	s.pretty()
    }
    
    

    原因接收者类型是个指针而不是函数传个int。
    s.pretty()在内部是(&s).pretty()

  • 相关阅读:
    计算函数执行时间
    Go语言生成随机数
    413 Request Entity Too Large
    JavaScript变量与数据类型详解
    OAuth2.0认证详解
    prompt的工作原理
    JS 实现上传图片
    移动端的长按事件的实现
    实现自动关闭当前页面的效果
    前端异常捕获与上报
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11356213.html
Copyright © 2020-2023  润新知