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)
}

image

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("子类重写的方法")
}
posted @   我也有梦想呀  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示