25、方法
1、是什么?
Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集
方法只是一个函数,它带有一个特殊的接收器类型,它是在func关键字和方法名之间编写的。接收器可以是struct类型或非struct类型。接收方可以在方法内部访问。
2、语法
定义语法:
func (t type) methodName (parameter list)(return list){
}
func (接受者) 方法名(参数列表)(返回值列表){
}
method,同函数类似,区别需要有接受者。(也就是调用者)
例子:
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/9/26 20:17
* @tags 喜欢就去努力的争取
*/
package main
import "fmt"
func main() {
/*
定义语法:
func (t type) methodName (parameter list)(return list){
}
func (接受者) 方法名(参数列表)(返回值列表){
}
method,同函数类似,区别需要有接受者。(也就是调用者)
*/
w1 := Worker{name: "ly", age: 20, sex: "男"}
w1.work()
w2 := &Worker{name: "张三", age: 19, sex: "女"}
fmt.Printf("%T\n", w2)
w2.work()
w2.rest()
c1 := Cat{color: "白色", age: 4}
c1.work()
}
type Worker struct {
name string
age int
sex string
}
type Cat struct {
color string
age int
}
// 定义方法
func (w Worker) work() {
fmt.Println(w.name, "在工作")
}
func (p *Worker) rest() {
fmt.Println(p.name, "在摆烂")
}
func (c Cat) work() {
fmt.Printf("猫的颜色:%s,猫的年龄:%d \n", c.color, c.age)
}
3、方法与函数
A:意义
- 方法:某个类别的行为功能,需要指定的接受者调用
- 函数:一段独立功能的代码,可以直接调用
B:语法
- 方法:方法名可以相同,接受者不同
- 函数:函数名不能冲突
4、变量的作用域
作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围
Go 语言中变量可以在三个地方声明:
- 函数内定义的变量称为局部变量
- 函数外定义的变量称为全局变量
- 函数定义中的变量称为形式参数
局部变量
- 在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量
全局变量
- 在函数体外声明的变量称之为全局变量,首字母大写全局变量可以在整个包甚至外部包(被导出后)使用。
5、方法的继承、方法的重写
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/9/26 21:00
* @tags 喜欢就去努力的争取
*/
package main
import "fmt"
func main() {
p1 := Person{name: "李四", age: 20}
fmt.Println(p1.name, p1.age)
p1.eat() // 访问自己的方法
s1 := Student{Person: Person{name: "张无忌", age: 35}, school: "武汉大学"}
s1.eat() // 访问父类的方法
fmt.Println(s1)
fmt.Println(s1.name) // 访问父类的字段属性
fmt.Println(s1.age)
fmt.Println(s1.school)
s1.study() // 子类的方法
s1.eat() // 子类的方法
s1.Person.eat() // 父类的方法
}
type Person struct {
name string
age int
}
type Student struct {
Person
school string
}
func (p Person) eat() {
fmt.Println("父类的方法")
}
func (s Student) study() {
fmt.Println("子类的方法")
}
func (s Student) eat() {
fmt.Println("子类重写的方法")
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构