定义上的区别
在Golang里面,方法和函数是两个不同的概念。具体而言:
type task struct{
name string
}
// 函数定义
func getName(t task){
println(t.name)
}
// 方法定义
func (t task) Name() {
println(t.name)
}
方法相比函数需要绑定一个结构体,比如这里的task结构体;那么我们称Name()是task结构体的方法。方法里如果想要使用绑定的结构体的数据直接通过结构体实例名 + . +对应数据或者方法即可。
调用上的区别
函数的调用参数必须要一模一样,而方法的指针和值可以互相换
func main() {
// 函数调用,定义的时候是值传递调用是必须是值,指针同理
var t task = task{"Rexi"}
a := getName(t) //正确
b := getName(&t)//错误,因为定义是task必须是值类型
// 方法调用,定义是值类型,调用可以是值也可以是指针;定义是指针,调用可以是值也可以是指针
c := t.Name() // 正确
d := (&t).Name()//也正确,golang会把&t变成值t来调用Name
//同理,如果Name的定义是func (t *task) Name() {}
//上述c和d的调用方法依然正确
}
但是需要注意的是,两种定义方式的不同:
//方式一
func (t task) Name() {
println(t.name)
}
//方式2
func (t *task) Name() {
println(t.name)
}
其中方式一是创建一个task的副本,方法不能修改对应的task实例,是只读
而方式二是用内存,所以可以在方法内部修改task实例。
待续(在工程项目中对方法的运用)