什么是方法

Go语言中方法和函数类似,也可以认为方法是特殊类型的函数,只不过方法限制了接收者,方法也可以说是包含了接收者的函数。

结构体类型调用方法

package main

import "fmt"

func main() {
    // 创建一个角色
    r := Role{
        Name:       "张三",
        Level:      1,
        SkillLevel: 1,
    }
    // 调用角色的方法
    r.ShowInfo()
}

// 创建一个角色,只有该角色能调用方法
type Role struct {
    Name       string // 角色名称
    Level      int    // 角色等级
    SkillLevel int    // 技能等级
}

// 创建一个方法,该方法只有角色能调用
func (r Role) ShowInfo() {
    fmt.Printf("我是:%s, 我的等级是:%d, 我的技能等级是:%d", r.Name, r.Level, r.SkillLevel)
}

输出

我是:张三, 我的等级是:1, 我的技能等级是:1

指针类型方法

方法的接收者可以是结构体类型,也可以是一个值,或者是一个指针类型。

package main

import "fmt"

func main() {
    // 创建一个角色
    r := Role{Name: "张三", Level: 1, SkillLevel: 1}
    r.ShowInfo1()

    r2 := &Role{Name: "李四", Level: 6, SkillLevel: 6}
    r2.ShowInfo2()
}

// 创建一个角色,只有该角色能调用方法
type Role struct {
    Name       string // 角色名称
    Level      int    // 角色等级
    SkillLevel int    // 技能等级
}

func (r Role) ShowInfo1() {
    fmt.Printf("我是:%s, 我的等级是:%d, 我的技能等级是:%d\n", r.Name, r.Level, r.SkillLevel)
}

func (r *Role) ShowInfo2() {
    fmt.Printf("我是:%s, 我的等级是:%d, 我的技能等级是:%d\n", r.Name, r.Level, r.SkillLevel)
}

输出

我是:张三, 我的等级是:1, 我的技能等级是:1
我是:李四, 我的等级是:6, 我的技能等级是:6

任意类型方法

Go语言中,使用type关键字可以定义出新的自定义类型,有了自定义类型之后我们就可以为自定义类型添加各种方法了。

package main

import "fmt"

// 定义类型
type LearnGo int

// 定义清空方法
func (l LearnGo) Clear() bool {
    l = 0
    return true
}

// 定义添加方法
func (l LearnGo) Add(num int) int {
    return int(l) + num
}

func main() {
    var l LearnGo
    fmt.Println(l.Clear()) // 调用清空方法
    fmt.Println(l.Add(10)) // 调用添加方法
    fmt.Println(l.Clear()) // 调用清空方法
    fmt.Println(l.Add(20)) // 调用添加方法
    fmt.Println(l.Clear()) // 调用清空方法
    fmt.Println(l)
}

输出

true
10
true
20
true
0

函数与方法的区别

  • 方法限制某个类别的行为,需要指定调用者。函数是一段独立的功能代码,可以直接调用。
  • 方法名称可以相同,只要接收者不同就可以,函数命名上不能冲突。
Last modification:November 18, 2022
If you think my article is useful to you, please feel free to appreciate