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