【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 string
        Age int
        School string
}

func main(){
        //创建老师结构体的实例、对象、变量:
        var t1 Teacher // var a int
        fmt.Println(t1) //在未赋值时默认值:{ 0 }
        t1.Name = "老师甲"
        t1.Age = 24
        t1.School = "XX大学"
        fmt.Println(t1)
        fmt.Println(t1.Age + 10)
}

2、结构体实例的创建

  • 方式一:直接创建

在这里插入图片描述

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

在这里插入图片描述

  • 方式三:使用new关键字,返回一个指针类型,语法new(结构体类型名称)
package main
import "fmt"

//定义老师结构体,将老师中的各个属性  统一放入结构体中管理:
type Teacher struct{
        //变量名字大写外界可以访问这个属性
        Name string
        Age int
        School string
}

func main(){
        //创建老师结构体的实例、对象、变量:
        var t1 *Teacher = new(Teacher)
        //t1此时是指针,存了一个地址,应该给这个地址指向的对象的字段赋值
        (*t1).Name = "老师甲"
        (*t1).Age = 24
        //为了符合开发者习惯,go简化了赋值方式
        t1.School = "XX大学"  //go编译器底层对t1.School转化(*t1).School
        fmt.Println(t1)
}
  • 方式四:返回一个指针类型
package main
import "fmt"

//定义老师结构体,将老师中的各个属性  统一放入结构体中管理:
type Teacher struct{
        //变量名字大写外界可以访问这个属性
        Name string
        Age int
        School string
}

func main(){
        //创建老师结构体的实例、对象、变量:
        var t1 *Teacher = &Teacher{}
        //t1此时是指针,存了一个地址,应该给这个地址指向的对象的字段赋值
        (*t1).Name = "老师甲"
        (*t1).Age = 24
        //为了符合开发者习惯,go简化了赋值方式
        t1.School = "XX大学"  //go编译器底层对t1.School转化(*t1).School
        fmt.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 Student

func 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 = 30
        fmt.Println("i = ",i)
}

//值传递改为指针类型
func (i *integer) change(){
        *i = 30
        fmt.Println("i = ",*i)
}


func main(){
        var i integer = 20
        i.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 string
        Age 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,二者访问时带了包名.结构体名称。如果想要首字母小写实现访问 => 工厂模式

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面向对象编程中的StringBuffer类详解

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

vulhub中Apache solr XML 实体注入漏洞复现(CVE-2017-12629)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞:XML…

VSCode 设置vue2模板

点击设置 > 用户代码片段 > 输入Vue &#xff08;打开vue.json&#xff09;> 将代码复制内 "Print to console": {"prefix": "<","body": ["<template>"," <div class$1></div>"…

AI绘图cuda与stable diffusion安装部署始末与避坑

stable diffusion的安装说起来很讽刺&#xff0c;最难的不是stable diffusion&#xff0c;而是下载安装cuda。下来我就来分享一下我的安装过程&#xff0c;失败了好几次&#xff0c;几近放弃。 一、安装cuda 我们都知道cuda是显卡CPU工作的驱动&#xff08;或者安装官网的解释…

FPGA高端项目:解码索尼IMX327 MIPI相机+图像缩放+HDMI输出,提供开发板+工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理自研HLS图像缩放详解图像缓存HDMI输出工程…

3d在线虚拟数字展馆让学员通过游戏化体验接受爱国主义教育

随着科技的飞速发展&#xff0c;红色展厅已不再局限于实体空间。现在&#xff0c;借助VR虚拟仿真技术的强大力量&#xff0c;我们与多家党建馆推出一个全新的教育平台——VR红色虚拟展馆。在这里&#xff0c;爱国主题与尖端技术相结合&#xff0c;为广大学生提供一种全新的、互…

iPhone设备中如何分析和解决应用程序崩溃日志的问题

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…

4-Linux实用操作

1. 各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux 某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键 ctrl c 命令输入错误&#xff0c;也可以通过快捷键 ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl …

【SQL Server】将数据导入导出到Excel表格当中

最开始&#xff0c;博主介绍一下自己的环境&#xff1a;SQL Sever 2008 R2 SQL Sever 大致都差不多 1. 通过自带软件的方式 首先找到下载SQL Sever中提供的导入导出工具 如果开始界面没有找到自己下载的路径 C:\Program Files\Microsoft SQL Server\100\DTS\Binn下的DTSWiz…

模型优化系列1:分类器CenterLoss使用Pytorch实现MNIST、CIFAR10、CIFAR100分类图示

CentLoss实现 前言 参考文章&#xff1a;史上最全MNIST系列&#xff08;三&#xff09;——Centerloss在MNIST上的Pytorch实现&#xff08;可视化&#xff09; 源码&#xff1a;Gitee或Github都有上传&#xff0c;保留了最优版&#xff0c;对最优版调整了一些参数看效果 Gitee…

运筹学经典问题(八):CVRP和VRP-TW

文章目录 问题描述问题建模决策变量数学建模基于容量的消除子环的约束 &#xff08;load-based SECs&#xff09; CVRP完整的数学模型加上时间窗限制的CVRP 问题描述 给定一个图&#xff0c;图上的点代表客户&#xff0c;边代表客户之间的路线&#xff0c;边的权重代表客户之间…

css-盒子阴影

1.box-shadow: 10px 20px 10px 10px blue; 参数对应顺序&#xff1a;上下&#xff0c;左右 &#xff0c;模糊程度&#xff0c;颜色 &#xff0c;阴影大小 2.box-shadow: 10px 20px 10px 20px blue,-10px -20px 10px 50px red; 负号就是相反方向 支持多个阴影 在后面加逗号 3…

128:忆往昔,迎春来

机缘 时间真的是过得好快啊&#xff0c;128&#xff0c;距离我的第一篇博客已经128天了&#xff0c;从大一上的冬天&#xff0c;到大一下的春夏&#xff0c;从一个初入大学的新人&#xff0c;到一个开始思考未来的新人。我开始不断更新博客&#xff0c;开始不断吸收知识&#…

OpenHarmony分布式五子棋-使用Canvas组件 实现棋盘、棋子的绘制

介绍 五子棋是一款比较流行的棋类游戏&#xff0c;此游戏使用分布式数据管理功能开发完成的。 本示例使用Canvas组件 实现棋盘、棋子的绘制&#xff0c;使用分布式数据管理 实现两台设备间数据的同步。 本示例使用分布式设备管理能力接口ohos.distributedDeviceManager。 分…

网络原理 - HTTP / HTTPS(1)——http请求

目录 一、认识HTTP协议 理解 应用层协议 二、fiddler的安装以及介绍 1、fiddler的安装 2、fiddler的介绍 三、HTTP 报文格式 1、http的请求 2、http的响应 五、认识URL 六、关于URL encode 一、认识HTTP协议 HTTP 全称为&#xff1a;“超文本传输协议”&#xff0c;是…

MySQL 连接池的实现

池化技术 池化技术能够减少资源对象的创建次数&#xff0c;提高程序的响应性能&#xff0c;特别是在高并发下这种提高更明显。共同特征 对象创建时间长。对象创建需要大量资源。对象创建后可被重复使用。 数据库连接池 数据库连接池&#xff08;Connection pooling&#xff…

【JAVA】postman import certificates in project 导入证书pfx

1. 打开这个按钮 2. File ->Settings 3. 打开“certificates”, Add certificates 添加证书 4. 输入证书地址&#xff0c;然后选择证书文件pfx , 输入证书密码。点击添加就可以了。 特别提醒&#xff1a; 推荐本地自己证书验证软件&#xff0c;“KeyStore” 这个软件可以…

SpringMVC --- 老杜

1、什么是SpringMVC&#xff1f; SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的及部分&#xff0c;…

Java的Object类和Objects类和包装类和StringBuilder类和StringJoiner的简单API

Object类&#xff1a; public String toString(); Returns a string representation of the object. 基本作用&#xff1a;返回对象的字符串表示形式 存在的意义&#xff1a;让子类重写&#xff0c;以便返回子类对象的内容 public class student {private String name;private…