golang函数与方法的区别
1.调用方式的区别
函数的调用方式:函数名(参数...)
方法的调用方式: 变量.方法名(参数...)
2.函数的使用
package main
import "fmt"
//函数参数为值类型,调用的时候只能传递值类型数据,不能传递指针类型
func Sum(a, b int) int {
return a + b
}
//函数的参数为指针类型,调用的时候只能传递指针类型,不能传递值类型
func Sub(a, b *int) int {
return *a - *b
}
func main() {
a, b := 10, 2
fmt.Println(Sum(a, b))
fmt.Println(Sub(&a, &b))
}
3.方法的使用
package main
import "fmt"
type Person struct {
Name string
Age int
}
//接收者为值类型时,可以接受指针类型变量调用方法,反之亦然
func (p Person) setAge(age int) {
p.Age = age
}
func (p *Person) setName(name string) {
p.Name = name
}
func (p Person) PrintName() {
fmt.Println(p.Name)
}
func main() {
p1 := Person{
Name: "张三",
Age: 10,
}
p1.setName("王五") //Name=王五
(&p1).setName("赵六") //Name=赵六
p1.setAge(12)
(&p1).setAge(12) //Age= 10
fmt.Println(p1)
p1.PrintName()
}
由代码可以看出:
- 不管调用形式如何,真正决定是值拷贝还是地址拷贝,需要看方法和那个类型进行绑定。
- 方法和值类型绑定,比如(p Person),则是值拷贝。不论是p1.SetAge(12)还(&p1).setAge(12)都不会改变Age的值。
- 方法和指针类型绑定,比如(p *Person),则是地址拷贝。不论是值类型p1.setName("王五") 还是指针(&p1).setName("赵六")都可以改变Name的值。
4.总结
- 对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。
- 对于方法,接收者为值类型时,可以直接用指针类型的变量调用方法,发过来同样也可以。