Go语言方法定义

幸运草 2020年4月20日21:32:15函数代码评论阅读模式

Go语言方法定义

方法介绍
在 Go 语言中有一个概念和函数极其相似,叫做方法 。Go 语言的方法其实是作用在接收者(receiver)上的一个函数,接收者是某种非内置类型的变量。因此方法是一种特殊类型的函数。

接收者类型可以是(几乎)任何类型,不仅仅是结构体类型:任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型。但是接收者不能是接口类型。

方法的声明和普通函数的声明类似,只是在函数名称前面多了一个参数,这个参数把这个方法绑定到这个参数对应的类型上。

方法定义
首先声明一个自定义类型Test

type Test struct{}

方法参数 receiver 类型可以是 Test 或 *Test。类型 Test不能是接口或指针。

第一种,定义一个无参数、无返回值的方法

func (t Test) method() {
}
func (t *Test) method() {

}

第二种,定义一个单参数、无返回值的方法

func (t Test) method(i int) {
}
func (t *Test) method(i int) {

}

第三种,定义一个多参数、无返回值的方法

func (t Test) method(x, y int) {

}
func (t *Test) method(x, y int) {

}

第四种,定义一个无参数、单返回值的方法

func (t Test) method() (i int) {
    return
}
func (t *Test) method() (i int) {
    return
}

第五种,定义一个多参数、多返回值的方法

func (t Test) method(x, y int) (z int, err error) {
    return
}
func (t *Test) method(x, y int) (z int, err error) {
    return
}

方法和函数的关系

方法是特殊的函数,定义在某一特定的类型上,通过类型的实例来进行调用,这个实例被叫接收者。

接收者必须有一个显式的名字,这个名字必须在方法中被使用。 接收者类型必须在和方法同样的包中被声明。

注意: Go语言不允许为简单的内置类型添加方法,下面定义的方法是非法的。

package main

import (
    "fmt"
)

//方法不能是内置数据类型
func (a int) Add(b int) {
    fmt.Println(a + b)
}

编译错误:

cannot define new methods on non-local type int

我们可以用Go语言的type,来定义一个和int具有同样功能的类型。这个类型不能看成是int类型的别名,它们属于不同的类型,不能直接相互赋值。

合法的方法定义如下:

package main

import (
    "fmt"
)

type myInt int

func (a myInt) Add(b myInt) {
    fmt.Println(a + b)
}

func main() {
    var x, y myInt = 3, 6
    x.Add(y)
}

函数与方法的区别

1、对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。
2、对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。

特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草
Go语言中的常量 函数代码

Go语言中的常量

1 概述 常量,一经定义不可更改的量。功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率。从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改。例如当前处理器的架构...
Go语言的接口 函数代码

Go语言的接口

Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明...
Go语言支持的正则语法 函数代码

Go语言支持的正则语法

1 字符 语法 说明 . 任意字符,在单行模式(s标志)下,也可以匹配换行 字符类 否定字符类 d Perl 字符类 D 否定 Perl 字符类 ASCII 字符类 否定 ASCII 字符类 pN U...
Go语言的包管理 函数代码

Go语言的包管理

1 概述 Go 语言的源码复用建立在包(package)基础之上。包通过 package, import, GOPATH 操作完成。 2 main包 Go 语言的入口 main() 函数所在的包(pa...

发表评论