函数与方法的区别

37 阅读1分钟

定义上的区别

在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实例。


待续(在工程项目中对方法的运用)