Go语言入门指南6|青训营

49 阅读3分钟

这是 Go 语言学习记录系列的笔记6,快来跟我一起学习Go 的基础语法吧 Go 神 启动!

方法

Go 没有类,但是有结构体,所以可以为结构体类型定义方法。

方法就是一类带特殊的 接收者 参数的函数。

方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。 这个接受者就是来自结构体的对象,这意味着方法是属于对应结构体的 调用时,可以用对象.方法来调用方法 其他和普通函数没有什么区别

可以为非结构体类型声明方法

但只能为在同一包内定义的类型的接收者声明方法,而不能为其它包内定义的类型(包括 int 之类的内建类型)的接收者声明方法。 就是接收者的类型定义和方法声明必须在同一包内;不能为内建类型声明方法 要为非结构体类型声明方法,需要遵循以下语法结构:

gofunc (接收者类型) 方法名(参数列表) {
    // 方法的代码
}

其中,接收者类型是方法的所属类型,可以是任何非结构体类型。方法名和参数列表与方法函数的语法相同

指针接收者

你可以为指针接收者声明方法。 和 CPP 值传递引用传递的区别。 这意味着对于某类型 T,接收者的类型可以用 *T 的文法。(此外,T 不能是像 *int 这样的指针。) 指针接收者的方法可以修改接收者指向的值。由于方法经常需要修改它的接收者,指针接收者比值接收者更常用。 若使用值接收者,方法会对原始 值的副本进行操作。(对于函数的其它参数也是如此。)

1.带指针参数的函数必须接受一个指针 2.而以指针为接收者的方法被调用时,接收者既能为值又能为指针

3.接受一个值作为参数的函数必须接受一个指定类型的值: 4.而以值为接收者的方法被调用时,接收者既能为值又能为指针 即接收者可以值、指针类型混用,而函数参数两者不能混用

使用指针接收者的原因

首先,方法能够修改其接收者指向的值。

其次,这样可以避免在每次调用方法时复制该值。若值的类型为大型结构体时,这样做会更加高效。

接口

接口类型 是由一组方法签名定义的集合。

接口类型的变量可以保存任何实现了这些方法的值。

简单来说,就是类型实现了接口内的方法,这里是区分了接收者是值还是指针的。

接口与隐式实现

类型通过实现一个接口的所有方法来实现该接口。既然无需专门显式声明,也就没有“implements”关键字。可以省略 implements

隐式接口从接口的实现中解耦了定义,这样接口的实现可以出现在任何包中,无需提前准备。

因此,也就无需在每一个实现上增加新的接口名称,这样同时也鼓励了明确的接口定义。

接口值

接口也是值。它们可以像其它值一样传递。

接口值可以用作函数的参数或返回值。

在内部,接口值可以看做包含值和具体类型的元组:

(value, type)

接口值保存了一个具体底层类型的具体值。

接口值调用方法时会执行其底层类型的同名方法。