【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格式进行响应。其目标是打造更智能、更安全的代码解释器和工具…

【力扣一刷】代码随想录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数组按照一定规则进行重组、筛选、映射或转换…

【御控物联】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…

轮播卡片切换实现

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

并查集----格子游戏

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

蓝桥杯单片机速成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…

动态规划刷题(算法竞赛、蓝桥杯)--合唱队形(线性DP)

1、题目链接&#xff1a;[NOIP2004 提高组] 合唱队形 - 洛谷 #include <bits/stdc.h> using namespace std; int n,ans; int a[105],f[105][2];//f[i][2]中2表示正反两个方向int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}//正方向求最长上升子序列 a[…

[flink 实时流基础] 输出算子(Sink)

学习笔记 Flink作为数据处理框架&#xff0c;最终还是要把计算处理的结果写入外部存储&#xff0c;为外部应用提供支持。 文章目录 **连接到外部系统****输出到文件**输出到 Kafka输出到 mysql自定义 sink 连接到外部系统 Flink的DataStream API专门提供了向外部写入数据的方…

HTTP,Servlet

HTTP 概念&#xff1a;HyperTextTransferProtocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 HTTP协议特点&#xff1a; 1.基于TCP协议&#xff1a;面向连接&#xff0c;安全 2.基于请求-响应模型的&#xff1a;一次请求对应一次响应 …

【学习笔记】java项目—苍穹外卖day06

文章目录 苍穹外卖-day06课程内容1. HttpClient1.1 介绍1.2 入门案例1.2.1 GET方式请求1.2.2 POST方式请求 2. 微信小程序开发2.1 介绍2.2 准备工作2.3 入门案例2.3.1 小程序目录结构2.3.2 编写和编译小程序2.3.3 发布小程序 3. 微信登录3.1 导入小程序代码3.2 微信登录流程3.3…

基于Java的车辆出入校预约管理系统设计与实现(论文+源码)_kaic

摘 要 二十一世纪以来我国科技水平得到很大提升&#xff0c;人们对于生活的美好向往更加强烈&#xff0c;而目前的车辆出入校预约管理由于存在管理不规范等缺点&#xff0c;严重影响了校园的安全&#xff0c;因此&#xff0c;需要设计一个车辆出入校预约管理系统对人们出入校园…

帝国CMS十合一源码/字典/成语/古诗词/二十四节气/英语单词/百家姓/范文文库/词语等

帝国CMS十合一源码/字典/成语/古诗词/二十四节气/英语单词/百家姓/范文文库/词语等 功能包含: 成语大全 二十四节气 英语单词 古诗词 近反义词 词语造句 汉语字典 英文缩写 百家姓 范文文库 文件目录:1个数据库 1个系统源码 1个伪静态规则 安装方式:把1.2G的…