定义类型

Go经常使用struct作为基础类型来定义类型,但是它们也能基于int、string、bool或者其他任何类型。

  • Go语言简单地不支持重载。

定义方法

方法定义与函数定义很像。事实上,它们只有一点不同:你需要增加一个额外的参数,一个接收器参数,它在函数名称之前的括号中。

image-20201102094522957


方法调用

为了调用你定义的方法,键入你要在其上调用方法的值、一个点和要调用的方法的名称,跟着一对括号。这里你调用的方法的值被称为方法接收器。

方法调用和方法定义的相似性能帮助你记住语法:当你调用一个方法时,接收器要被列为第一个,并且当你定义一个方法的时候,接收器参数也被列为第一个。

方法定义中的接收器参数的名称并不重要,但它的类型很重要;你定义的方法与此类型的值都关联。

package main
import (
	"fmt"
)
type mystr string
func (name mystr) hi()  {
	fmt.Print("hello "+name)
}
func main() {
	str:=mystr("world")
	str.hi()
}

image-20201102102351991


  • 方法(几乎)就像一个函数
  • 可以在方法名称后面的括号中定义额外的参数。参数变量与接收器参数一样,可以被方法块所访问。当你调用方法时,你将需要为每个参数提供值。
  • 与其他函数一样,你可以为方法声明一个或者多个返回值,返回值将在函数被调用时返回:
  • 方法名称以大写字母开头,则认为是导出的,如果它的名称以小写字母开头,则认为是不导出的。如果你想要在当前包之外使用你的方法,确保它的名字以大写字母开头。

指针类型的接收器参数

函数参数接收的是函数调用时值的拷贝,而不是原始的值,当函数退出后任何更新都会失效。为了让double函数正常工作,我们传递了一个我们想要更新的值的指针,然后更新这个指针指向的值。

接收器参数与普通参数没有不同。但是就像其他任何参数,接收器参数接收一个接收器的拷贝值。如果你使用方法来修改接收器,你修改的是拷贝,而不是原始值。

当你用一个非指针的变量调用一个需要指针的接收器的方法的时候,Go会自动为你将非指针类型转换为指针类型。同样指针类型也会自动转换为非指针类型,如果你调用一个要求值类型的接收器,Go会自动帮你获取指针指向的值,然后传递给方法。

package main
import (
	"fmt"
)
type mystr string
func (name *mystr) hi()  {
	fmt.Print("\nhello "+*name)
	*name="yi"
}
func main() {
	str:=mystr("world")
	str.hi()
	str.hi()
}

image-20201102103816876


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

封装和嵌入 上一篇
struct 下一篇