什么是方法
在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
函数与方法的区别
- 方法限制某个类别的行为,需要指定调用者。函数是一段独立的功能代码,可以直接调用。
- 方法名称可以相同,只要接收者不同就可以,函数命名上不能冲突。