• 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()

  • 相关阅读:
    VMware Tools的安装
    XmlSerializer
    string[][]和string[,] 以及 int[][]和int[,]
    Get Length 使用dynamic关键字
    Cocos2d-x 3.0final 终结者系列教程01-无论是从cocos2d-x2.x升级到版本cocos2d-x3.x
    Hosting WCF Service
    A*算法进入
    OpenCV面、人眼检测
    JAVA学习篇--JAVA两种编程模式控制
    采用Java语言如何实现高速文件复制?
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11356213.html
Copyright © 2020-2023  润新知