Go语言学习笔记 - PART8 - 方法

254 阅读1分钟

前言

  • Go的方法是作用在接收者上的一个函数,接收者是某种类型的变量,因此方法是一种特殊的函数
  • 接收者不能是接口类型,因为接口是一个抽象定义,但是方法是一个具体实现
  • 接收者是指针类型变量的时候,可以改变接收者变量的值

方法定义

func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }
  • 在方法名之前,func关键字之后的括号中指定接收者
  • recv类似于面向对象语言中的this或self,Go中并没有这两个关键字

Go中的面向对象

  • 结构体 + 方法 = 面向对象中的类
  • 结构体和方法可以放在不同的源文件,但是必须在同一个包

如果想要打破这条规则,可以为类型定义别名,然后再为别名定义方法,这样就可以不在同一个包下

  • 类型T(或者*T)上的所有方法的集合叫做类型T(或*T)的方法集

方法不允许重载

方法实际上也是函数,函数不能重载

  • 基于接收者类型的方法重载是允许的
// 接收者类型不一样的时候,允许方法重载
func (receiver receiverType1) func1 (args... argType) returnType 
func (receiver receiverType2) func1 (args... argType) returnType 

非结构体类型变量调用方法的实现方式


// 1. 给非结构体类型定义别名
type IntVector []int

// 2. 创建方法
func (v IntVector) sum() (s int){
    for _, x := range v {
        s += x
    }
    return
}

func main(){
    // 3. 调用方法
    IntVector{1,2,3}.sum();
}

函数和方法的区别

  • 函数将变量作为参数
  • 方法在变量上被调用
  • 接收者类型跟方法必须在同一个包中

入门教程推荐: github.com/Unknwon/the…