【Go】十三、面向对象:方法

文章目录

  • 1、面向对象
  • 2、结构体实例的创建
  • 3、结构体之间的转换
  • 4、方法
  • 5、结构体值拷贝
  • 6、方法的注意点
  • 7、方法和函数的区别
  • 8、跨包创建结构体实例

1、面向对象

  • Go的结构体struct ⇒ Java的Class类
  • Go基于struct来实现OOP
  • 相比Java,Go去掉了方法重载、构造函数和析构函数、隐藏的this指针

定义个结构体,并创建结构体的实例:

package main
import "fmt"//定义老师结构体,将老师中的各个属性  统一放入结构体中管理:
type Teacher struct{//变量名字大写外界可以访问这个属性Name stringAge intSchool string
}func main(){//创建老师结构体的实例、对象、变量:var t1 Teacher // var a intfmt.Println(t1) //在未赋值时默认值:{ 0 }t1.Name = "老师甲"t1.Age = 24t1.School = "XX大学"fmt.Println(t1)fmt.Println(t1.Age + 10)
}

2、结构体实例的创建

  • 方式一:直接创建

在这里插入图片描述

  • 方式二:使用{ },有点像Java的有参无参构造

在这里插入图片描述

  • 方式三:使用new关键字,返回一个指针类型,语法new(结构体类型名称)
package main
import "fmt"//定义老师结构体,将老师中的各个属性  统一放入结构体中管理:
type Teacher struct{//变量名字大写外界可以访问这个属性Name stringAge intSchool string
}func main(){//创建老师结构体的实例、对象、变量:var t1 *Teacher = new(Teacher)//t1此时是指针,存了一个地址,应该给这个地址指向的对象的字段赋值(*t1).Name = "老师甲"(*t1).Age = 24//为了符合开发者习惯,go简化了赋值方式t1.School = "XX大学"  //go编译器底层对t1.School转化(*t1).Schoolfmt.Println(t1)
}
  • 方式四:返回一个指针类型
package main
import "fmt"//定义老师结构体,将老师中的各个属性  统一放入结构体中管理:
type Teacher struct{//变量名字大写外界可以访问这个属性Name stringAge intSchool string
}func main(){//创建老师结构体的实例、对象、变量:var t1 *Teacher = &Teacher{}//t1此时是指针,存了一个地址,应该给这个地址指向的对象的字段赋值(*t1).Name = "老师甲"(*t1).Age = 24//为了符合开发者习惯,go简化了赋值方式t1.School = "XX大学"  //go编译器底层对t1.School转化(*t1).Schoolfmt.Println(t1)//也可这样var t2 *Teacher = &Teacher{"老师甲",22,"xx大学"}fmt.Println(t2)
}

最后,关于给结构体示例的字段赋值:

在这里插入图片描述

3、结构体之间的转换

  • 结构体和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
package main
import "fmt"
type Student struct {Age int
}
type Person struct {Age int
}
func main(){var s Student = Student{10}var p Person = Person{10}//注意s = Student(p)fmt.Println(s)fmt.Println(p)
}

type重新定义(相当于取别名),Go认为是新的数据类型,但是相互间可以强转

package main
import "fmt"
type Student struct {Age int
}type Stu Studentfunc main(){var s1 Student = Student{19}var s2 Stu = Stu{19}//注意s1 = Student(s2)fmt.Println(s1)fmt.Println(s2)
}

4、方法

type A struct {Num int
}
func (a A) test() {fmt.Println(a.Num)
}

调用方法:

var a A
a.test()
  • func (a A) test()相当于A结构体有一个方法叫test
  • (a A) 体现方法test和结构体A绑定关系,即必须是A结构体的实例去调用

举例:

在这里插入图片描述

5、结构体值拷贝

结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式

值传递,即把值的副本进行了传递:

在这里插入图片描述

如果希望在方法中,改变结构体变量的值,可以通过结构体指针的方式来处理

在这里插入图片描述
内存图:

在这里插入图片描述
以上代码可直接简化,编译器底层自动加上 & 和 *

在这里插入图片描述

6、方法的注意点

  • 不仅仅是struct,比如int , float32等都可以有方法
package main
import "fmt"//起别名
type integer int//调这个方法必须是integer类型的实例
func (i integer) print(){i = 30fmt.Println("i = ",i)
}//值传递改为指针类型
func (i *integer) change(){*i = 30fmt.Println("i = ",*i)
}func main(){var i integer = 20i.print() 	//值传递,不会改变main方法栈中的i的值i.change()	//会改变main方法栈中的i的值fmt.Println(i)	//30
}
  • 同函数,方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问

  • 如果一个类型实现了String()这个方法,那么fmt.Println输出这个类型的变量时,默认会调用这个类型中的String()进行输出,Java的toString

package main
import "fmt"
type Student struct{Name stringAge int
}func (s *Student) String() string{str := fmt.Sprintf("Name = %v , Age = %v",s.Name,s.Age)return str
}func main(){stu := Student{Name : "丽丽",Age : 20,}//传入地址,如果绑定了String方法就会自动调用fmt.Println(&stu)
}

7、方法和函数的区别

  • 方法需要绑定指定数据类型,函数不用
  • 调用方式不同
//调用函数
函数名(实参列表)
//调用方法
变量.方法名(实参列表)

示例:

package main
import "fmt"
type Student struct{Name string
}
//定义方法:
func (s Student) test01(){fmt.Println(s.Name)
}
//定义函数:
func method01(s Student){fmt.Println(s.Name)
}
func main(){//调用函数:var s Student = Student{"丽丽"}method01(s)//方法调用:s.test01()
}//输出结果
//丽丽
//丽丽
  • 对于函数来说,形参对应是什么就要传入什么
package main
import "fmt"
type Student struct{Name string
}
//定义函数:
func method01(s Student){fmt.Println(s.Name)
}
func method02(s *Student){fmt.Println((*s).Name)
}
func main(){var s Student = Student{"丽丽"}method01(s)//method01(&s)错误method02(&s)//method02(s)错误
}
  • 对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。
package main
import "fmt"
type Student struct{Name string
}
//定义方法:
func (s Student) test01(){fmt.Println(s.Name)
}
func (s *Student) test02(){fmt.Println((*s).Name)
}
func main(){var s Student = Student{"丽丽"}s.test01()(&s).test01()//虽然用指针类型调用,但是传递还是按照值传递的形式(&s).test02()s.test02()//等价
}

8、跨包创建结构体实例

在这里插入图片描述

在另一个包下创建实例:

在这里插入图片描述

注意上面能访问到,一者该结构体名称首字母大写,public,二者访问时带了包名.结构体名称。如果想要首字母小写实现访问 => 工厂模式

在这里插入图片描述
在另一个包下创建实例:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css- 4

1.浮动 1. 浮动最初用于实现文字环绕效果 2. 现在,浮动是主流的布局方式之一 1.1元素浮动之后的特点 元素浮动之后,称为浮动元素,具有如下特点: 1. 浮动元素脱离文档流 2. 多个浮动的元素会水平排列,一行放不下自动换…

Redis高级面试题-2024

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库,也是一种NoSQL数据库。 它支持多种数据类型,包括String、Map、Set、ZSet和List,以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础,提…

chatglm.cpp编译与执行

ChatGLM3介绍 ChatGLM3是由智谱AI和清华大学KEG实验室联合发布的对话预训练模型。作为第三代大型语言模型,ChatGLM3不仅理解和生成人类语言,还能执行代码、调用工具,并以markdown格式进行响应。其目标是打造更智能、更安全的代码解释器和工具…

常用的对象方法帮助快速理解

Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 const target { a: 1, b: 2 }; const source { b: 4, c: 5 }; const returnedTarget Object.assign(target, source); console.log(target);// { a: 1, b: 4, c: 5 } co…

125. 验证回文串

思路 首先枚举出字母和数字(orz…看了其他人的题解, 才想起来Character.isLetterOrDigit可以直接判断字符串是否字母或数字);声明左指针指向入参第0位, 右指针指向入参最后一位, 用于判断左指针指向的元素(简称左元素)是否等于右指针指向的元素(简称右元素), 每遍历一次都会让…

【力扣一刷】代码随想录day27(39. 组合总和、40.组合总和II、131.分割回文串)

目录 【39. 组合总和】中等题 【40.组合总和II】中等题 【131. 分割回文串】中等题 【39. 组合总和】中等题 思路: 确定终止条件:sum target时记录路径并返回。剪枝:当前节点的路径之和已经大于sum就不可能再等于sum了,结束该分支…

16进制的字符串转byte[]数组 以及将字节数组转换成十六进制的字符串

16进制的字符串转byte[]数组 public class ClientString16 {@Testpublic void get16Str(){String str="48 47 12 00 14 12 16 08 15 0d 30 0f 02 30 30 30 30 30 30 30 30 30 30 00 c2";byte[] bytes = hexStringToByteArray(str);getBytetoString(bytes);//String …

【御控物联】JavaScript JSON结构转换(12):对象To数组——键值互换属性重组

文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

LeetCode 每日一题 2024/3/25-2024/3/31

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/25 518. 零钱兑换 II3/26 2642. 设计可以求最短路径的图类3/27 2580. 统计将重叠区间合并成组的方案数3/28 1997. 访问完所有房间的第一天3/29 2908. 元素和最小的山形三…

【御控物联】JavaScript JSON结构转换(8):数组To数组——多层属性重组

文章目录 一、JSON结构转换是什么?二、案例之《JSON数组 To JSON数组》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换,生成新的JS…

Java

1.学生和老师都会有work方法,学生的工作是学习,老师的工作是教书,我利用了一个接口来实现; 2.同时,老师和学生都是人,并且都有姓名,姓名,年龄和身高等特征,我用了一个继承…

http协议补充

7.7实现http请求 class httprequest { public:void Deserialize(std::string content){while (true){auto pos content.find(sep);if (pos std::string::npos){break;}std::string temp content.substr(0, pos);if (temp.empty()){break;}req_header_.push_back(temp);cont…

Redis 服务

任务描述:请采用 redis 服务,实现高并发数据和海量数据的读写。 (1)利用 linux2 搭建 redis cluster 集群,使用端口 7001-7003模拟主节点,7004-7006 模拟从节点,让其他主机可以访问 redis 集群。 [root@linux4 ~]# yum install -y redis policycoreutils-python-utils…

轮播卡片切换实现

背景 如上图&#xff0c;实现一个轮播卡片能力&#xff0c;支持手动滑动&#xff0c;手动拖动&#xff0c;已经点击两端切换按钮。 实现 <template><div class"top-menu"><!-- Swiper --><div v-if"headerMenuList.length > 9" c…

并查集----格子游戏

并查集中最重要的是要搞懂&#xff1a; 不明白的可以拿纸自己先演示一番&#xff0c;find函数不仅能找到他们的祖先数&#xff0c;而且同时也能更新路径的子结点都等于祖先&#xff0c;然后以后寻找时会更加的方便&#xff01;

如何优雅地用latex写算法作业

中文支持 建议直接看这篇dalao的文章&#xff0c;三种方法写的很清楚 LaTex支持中文的三种方式_latex 编译中文-CSDN博客 代码插入 C 文章前面加 \definecolor{mygreen}{rgb}{0,0.6,0} \definecolor{mygray}{rgb}{0.5,0.5,0.5} \definecolor{mymauve}{rgb}{0.58,0,0.82} …

C++学习建议

C是一门强大且广泛应用的编程语言&#xff0c;特别适合系统级开发、高性能应用和游戏引擎等场景。如果你准备深入学习C&#xff0c;以下是一些关键点和学习路径建议&#xff1a; 1. **基础语法**&#xff1a;首先掌握C的基础语法&#xff0c;如变量声明与赋值、数据类型、运算…

蓝桥杯单片机速成4-温度传感器DS18B20

目录 一、电路图 二、底层驱动代码 三、温度读取实现 四、实际使用 一、电路图 二、底层驱动代码 时序是单总线 我们需要修改的地方是单总线内部延时函数&#xff0c;改成 void Delay_OneWire(unsigned int t) { t*12; while(t--); } #ifndef __ONEWIRE_H #defi…

Unity TrailRenderer的基本了解

在Unity中&#xff0c;TrailRenderer组件用于在对象移动时创建轨迹效果。通常用于增强游戏中的动态物体&#xff0c;比如子弹、飞行道具或者角色移动时的拖尾效果。 下面来了解下它的基本信息。 1、创建 法1&#xff1a;通过代码创建 using UnityEngine;public class Trail…