当前位置: 首页 > article >正文

十、快速入门go语言之方法

文章目录

    • 方法
      • :one: 方法的概念
        • :star2: 内嵌类型的方法和继承
        • :star2: 多重继承

📅 2024年5月9日

📦 使用版本为1.21.5

方法

1️⃣ 方法的概念

⭐️ 在Go语言中没有类这个概念,可以使用结构体来实现,那类方法呢?Go也同样的实现,那就是方法

⭐️ 方法和函数长得很像,但是它多出来了一个"接收者"的选项(我也不知道为啥要这么高大上的名字,看书的时候都给我看蒙蔽了),其实就是和一个结构体(类),或者一个类型进行绑定比如下面的列子

this表示one这个类,和java中的this或者pythonself类似表示当前类,也就是表示这个方法是属于one类的

type one struct {
	a int
	b int
}

func (this one) GetA() {//this类似于java中的this,表示这个类
	println(this.a) 
}

func main() {
	one := &one{1, 2} //这里有没有很像创建一个类
	one.GetA()  //然后调用类方法
}

⭐️ 接收者的类型,可以是int,bool,string,数组函数的别名(经过type定义的)类型,但是不能是一个接口类型,接口是一个抽象定义,方法是具体的实现,而且还不能是一个指针类型,但是可以是可以是前面几种类型的指针类型

⭐️ 在go中方法和类可以不用写在一个源代码(体现的很明显了),可以分开写,但是必须在同一个包内!

⭐️ 方法在一个接收者类型中只能存在一个(名字),不能存在多个,但是可以在不同接收者类型中多个(名字)

//不同的接收者类型
func (this two) GetA() { 
	println(this.a)
}

func (this one) GetA() { 
	println(this.a)
}

⭐️ 如果想定义的方法可以在外部调用(你可以发现Go中已经实现的方法如fmt.Println它们都是开头首字母大写),前面说过,需要首字母大写

⭐️ 绑定类型(传入接收者)最好是使用指针类型,否则传入的接收者类只是类的一个拷贝,下面这个列子就体现出来了

ps: 这里的SetGet很像java对不对

type one struct {
	a int
	b int
}

func (this one) GetA() {
	println(this.a)
}
func (this one) SetA(i int) int { //修改a
	this.a = i
	return this.a
}

func main() {
	one := &one{1, 2} 
	one.GetA()        //输出1
	one.SetA(3) //使用Set方法修改为 3
	one.GetA()   //输出1
}

如果换成指针

type one struct {
	a int
	b int
}

func (this *one) GetA() {
	println(this.a)
}
func (this *one) SetA(i int) int { //使用指针类型
	this.a = i
	return this.a
}

func main() {
	one := &one{1, 2}
	one.GetA()  //输出1
	one.SetA(3) //使用Set方法修改为 3
	one.GetA()  //输出3
}

😀 学到这里我直接懂了!这玩意和类差不多,甚至可以可以定义自己的getset方法,包括toString也可以,(幸好之前学完了java)

type Person struct {
	Name string
	age  int
	sex  string
}

func (this *Person) GetName() { //get方法
	println(this.Name)
}
func (this *Person) SetName(i string) string { //set方法
	this.Name = i
	return this.Name
}
func (this *Person) ToString() { //Tostring方法
	fmt.Println(
		"name :", this.Name,
		", age :", this.age,
		", sex :", this.sex,
	)
}

func main() {
	p1 := Person{"zhangsan", 18, "man"}
	p1.ToString()
}

⭐️ 对象的字段不应该由2个或2个以上的不同线程在同一时间去改变(在后面会学解决办法)

🌟 内嵌类型的方法和继承

⭐️ 一个匿名类型被嵌入到结构体中,匿名类型的可见方法也同样被内嵌,相当于继承

🌟 多重继承

⭐️ 简单来说就是一个一个子类可以继承多个父类,在Java中是不被允许的,但是在Go结构体匿名字段下可以实现,只需要通过内嵌两个就好了

type Person struct { //人的基本
	Name string
	age  int
	sex  string
}

type Student struct { //学生
	School string
	score  int
	ranked   int
}
type You struct { //你
	Person //你是个人也是一个学生
	Student
}

func main() {
	p1 := You{
		Person:  Person{"lisi", 18, "男"},
		Student: Student{"茶啊二中", 99, 1},
	}
	fmt.Println(p1)
}

http://www.kler.cn/a/383027.html

相关文章:

  • 如何通过网络加速器提升TikTok创作与观看体验
  • AUTOSAR CP NVRAM Manager规范导读
  • 梧桐数据库之以识别优质的移动服务套餐为例讲解SQL实现分享
  • 大客户营销数字销售实战讲师培训讲师唐兴通专家人工智能大模型销售客户开发AI大数据挑战式销售顾问式销售专业销售向高层销售业绩增长创新
  • .NET周刊【11月第1期 2024-11-03】
  • contenteditable实现需要一个像文本域一样的可编辑框
  • linux tar 打包为多个文件
  • 第J9周:Inception v3算法实战与解析(pytorch版)
  • MySQL的sql练习,适合初学者
  • 共同探索未来科技新境界 冠捷科技集团及腾讯云AI智能战略合作签约会
  • 开源的 API 学习平台「GitHub 热点速览」
  • 全面解析:网络协议及其应用
  • asp.net文件防盗链
  • 理解spring中的AOP
  • git 提交代码流程
  • 递归 != 递龟
  • 和合共赢 丨 广州探迹科技有限公司与泰迪智能科技战略合作签约仪式圆满结束
  • Redis常见面试题(二)
  • 蓝牙协议的前世今生
  • 猫用空气净化器哪个牌子好?求除毛好、噪音小的宠物空气净化器!
  • 华为eNSP:QinQ
  • RTDE确保整个机械臂(包括关节和连杆)都不会进入预设的不安全空间范围
  • 02 高效调优:Oracle内存体系的精细化管理实践
  • 聚观早报 | 比亚迪腾势D9登陆泰国;苹果 iOS 18.2 将发布
  • HDFS和HBase跨集群数据迁移 源码
  • 【PGCCC】Postgresql slru 缓存和存储