22-Golang方法---定义和调用

方法
方法是为特定类型定义的,只能由该类型调用的函数。

方法是添加了接收者的函数,接收者必须是自定义的类型。

func (t Type) method(parameters) returns{

}
package main

import "fmt"

// 自定义结构体
type Dog struct {
    name string
}

// 为结构体定义方法Call, Call只能dog调用
func (dog Dog) Call() {
    fmt.Printf("%s: 汪汪\n", dog.name)
}

// 为结构体定义方法SetName
func (dog Dog) SetName(name string) {
    dog.name = name
}

// 定义dog结构体的PsetName方法,接受者为指针对象
func (dog *Dog) PsetName(name string) {
    dog.name = name
}

func main() {
    //声明结构体
    var dog Dog
    //字面量赋值
    dog.name = "小黑"
    dog.Call()

    // 初始化结构体
    dog = Dog{"豆豆"}
    // 调用结构体的方法
    dog.Call()

    // 更改dog的名字
    // dog.Name = "小黑"
    // dog.Call()

    // 调用结构体方法
    dog.SetName("小黑")
    dog.Call()

    /*
            当使用结构体指针对象调用值接收者的方法时,Go 编译器会自动将指针对象”解引用”为值调用方法;
            当使用结构体对象调用指针接收者的方法时,Go 编译器会自动将值对象”取引用”为指针调用方法;

            注:取引用和解引用发生在接收者中,对于函数/方法的参数必须保持变量类型一一对应

            使用值接收者还是指针接收者,取决于是否现需要修改原始结构体
                若不需要修改则使用值,若需要修改则使用指针
                若存在指针接收者,则所有方法使用指针接收者
    */

    // (&dog).PsetName("小黑") 取引用
    dog.PsetName("小黑") // 自动取引用 语法糖
    dog.Call()

    pdog := &Dog{"豆豆"}
    (*pdog).Call()
    pdog.PsetName("小黑")
    // (*pdog).Call() 自动解引用 语法糖
    pdog.Call()
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容