Go语言方法(10)| Go主题月

256 阅读4分钟

方法不是和函数是一样的吗?Go语言里面方法和函数是两个概念。有什么不同呢?我们先来回顾一补充下方法是什么。

image.png

函数的回顾补充

我们知道Go语言一个非常重要的函数:main 函数。我们在举例子的时候都会用到它。main函数通常也会调用其他函数,我们来一个完整例子:

package main
import "fmt"

func add(a int, b int ) int {
    return a + b
}

func main() {
    a:=1 
    b:=2 
    fmt.Println(add(a, b)) //3
}

总结一下一般函数有几个部分组成:
关键字:func
函数名:add
函数的传入参数:a int,b int
函数的返回值类型:int
函数的执行体: return a + b
补充:Println 这个也叫函数,这个函数属于fmt这个包的。Println是一个公有函数,可以在fmt这个包外面调用,公有函数首字母必须大写,小写字母开头的函数只能在同一个包里面被调用执行,任何一个函数只属于一个包。

image.png

方法

方法最大的不同就是方法必须要有一个接收者,方法不要接收者几乎是一个函数,接收者就是一个类型,这样就把一个类型和一个方法绑定在一起了,这个方法就是这个类型的方法。有点懵,下面举个例子:

package main
import "fmt"



type Test int
func (test *Test) plus(){   //test Test 
    return test+10086
}

func (test *Test) plus(){   //test Test 
    return test+10086
}

func main(){
    Test.plus(1)
}

type我们会在后面的结构体里面说。在上面例子中定义了一个名字为Test 类型为string的类型。可以理解为面对对象中的类名,class 的名字,type声明了一个接收者。
type 和下面的func的内容就是一个完整的方法。
func 关键字后第一个括号里面 test Test 指定一个接收者,也就是绑定了一个接收者。
Show就是方法名 Show() 是类型 Test 的方法。 main函数中 Test.Show("mytest") 就是调用了接收者绑定的方法
一个接收者可以拥有有多个方法。这样看来像不像面对对象的类里面的方法?

image.png

补充知识:值类型接收者与指针类型接收者

在很多Go项目中我们可以看到很多指针类型的代码,对于不经常用指针的新手很不友好。我们来认真研究研究,函数接受指针类型的参数还可以很快的理解,方法接受者如果传入一个指针类型的参数一时半会可能弄不明白其中的逻辑。
方法的接收者除了有值类型还有指针类型,先要明白一点,在方法中接受的如果不是指针类型,要修改传入的内容是不生效的,值类型会复制一份修改,指针类型不会复制会直接修改传入的值,举一个例子:

package main
import "fmt"

type Test int

func (test *Test) Pointer(){  
    *test = 10086
}

func (test Test) Value()(){   
    test = 10000
}

func (test Test) Show()(){   
    fmt.Println(test)
}

func main(){
    TestValue := Test(1)  
    TestValue.Show() //TestValue调用了类型名为Test的接收者的方法 ,接受者值为1 类型为int,输出1
    TestValue.Value() //值传递修改值
    TestValue.Show() //输出1,没有改成10000
    TestValue.Pointer()  //指针传递修改了
    TestValue.Show() //修改为10086 

}

方法和接收者使用指针传递会非常常见,要提高警惕哦,方法的调用者在上面的例子为TestValue,是一个值类型的变量。方法的调用者也可以是一个指针类型的变量,这里可以简单说下Go语言器帮助开发者自动做的一些优化:
如果使用一个值类型变量调用指针类型接收者的方法,不用传递指针参数,编译器会自动让值类型变量的指针调用接收者方法。
同样的原理,如果使用一个指针类型变量调用值类型接收者的方法,编译器会自动使用指针所指向的值去调用接收者的方法。
下节课讲讲延申的结构体和接口,敬请期待。

image.png