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

news2024/11/28 14:32:07

文章目录

  • 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,二者访问时带了包名.结构体名称。如果想要首字母小写实现访问 => 工厂模式

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

在这里插入图片描述

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

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

相关文章

[Java基础揉碎]枚举

目录 先看一个需求 枚举介绍: 枚举实现的方式: >自定义类实现枚举实例: >使用enum关键字实现枚举 ​编辑 enum关键字实现枚举注意事项 enum常用方法 enum细节 先看一个需求 要求创建季节(Season)对象,请设计并完成。 // 传统的方法建造一个类: clas…

企业能耗数据分析有哪些优势?怎样进行分析?

随着互联网技术的发展,企业在运营中会出现大量的用能数据,但却做不了精准的用能数据分析,导致数据没有得到有效利用,以及产生能源浪费现象。 为什么企业用能分析总是难? 一、用能分析过程复杂 由于用能分析过于复杂…

websocketpp上手笔记-Windows安装

WebSocketpp是什么 最近手上有一个c项目,需要用websocket从服务器端收内容。于是网上找了圈,发现WebSocketpp库可以做websocket的客户端。 WebSocketpp也叫WebSocket,github地址是:https://github.com/zaphoyd/websocketpp&…

每天五分钟深度学习:神经网络和深度学习有什么样的关系?

本文重点 神经网络是一种模拟人脑神经元连接方式的计算模型,通过大量神经元之间的连接和权重调整,实现对输入数据的处理和分析。而深度学习则是神经网络的一种特殊形式,它通过构建深层次的神经网络结构,实现对复杂数据的深度学习…

商标名称的词性:因形近不良而驳回!

近期看到业内有许多因不良驳回的案例,有些是直接因为不良而驳回,普推知产老杨发现一个因形近而驳回的案例,2022年5月申请的“乡巴佬”通过初审下证了,2022年10月申请“乡巴饶”因形近“乡巴佬”不良而驳回,而且还做过驳…

打造安全医疗网络:三网整体规划与云数据中心构建策略

医院网络安全问题涉及到医院日常管理多个方面,一旦医院信息管理系统在正常运行过程中受到外部恶意攻击,或者出现意外中断等情况,都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等,…

Word、Excel、PPT文件转PDF文件(C#)

一、添加依赖 为wpf项目引用Microsoft.Office.Interop.Excel、Microsoft.Office.Interop.PowerPoint、Microsoft.Office.Interop.Word、Office,依赖文件已经打到源代码包里了。 二、先定义一些命名空间 using Word Microsoft.Office.Interop.Word;using Excel M…

Vue2.x安装Tinymce依赖冲突解决

Vue2.x安装Tinymce依赖冲突原因 使用vue整合tinymce富文本编辑器,安装依赖时报错 报错的原因是下载版本与vue的版本对不上vue2.x版本应该使用如下指定版本依赖更合适 npm install --save "tinymce/tinymce-vue^3.1"额外依赖为 npm install --save &quo…

ssm013小型企业办公自动化系统的设计和开发+vue

小型企业办公自动化系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱&am…

流行的API架构学习

几种流行的API架构风格图 SOAP(Simple Object Access Protocol) 优点:SOAP 是一种基于 XML 的通信协议,具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能,并支持复杂的消息交换模式。 缺点&#xf…

远控桌面多任务并发文件保密传输

远程桌面文件传输是一个重要的功能,大多数远控都是用的桌面程序模式,利用系统自带复制粘贴拖拽文件拷贝功能,做一个ole调用对接,可以将很多控制权交给操作系统。 但我做的是浏览器版,浏览器是沙盒原理,为了…

mkcert生成ssl证书+nginx部署局域网内的https服务访问问题

文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…

代码随想录第27天 | 39. 组合总和、40.组合总和II、131.分割回文串

一、前言 今天的主题还是回溯算法&#xff0c;还是根据那个backtracking模板&#xff0c;但是今天会涉及到去重和一些小细节的问题。 二、组合总和 1、思路&#xff1a; 我一开始的想法就是在for循环转化为&#xff1a; for(int i 0; i < size; i) 但是这个是会陷入一…

【LDLTS】拉普拉斯深能级瞬态光谱

Laplace deep level transient spectroscopy&#xff08;拉普拉斯深能级瞬态光谱&#xff0c;简称LDLTS&#xff09;是一种用于分析和表征半导体材料中深层能级缺陷的技术。它是传统能级瞬态光谱&#xff08;DLTS&#xff09;方法的扩展和改进&#xff0c;特别适用于解决传统DL…

Kubernetes kafka系列 | Strimzi 部署kafka-bridge

Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件&#xff0c;用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台&#xff0c;广泛用于构建实时数据流水线和流式应用程序。然而…

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…

用kimichat批量识别出图片版PDF文件中的文字内容

图片版的PDF文件&#xff0c;怎么才能借助AI工具来提取其中全部的文字内容呢&#xff1f; 第一步&#xff1a;将PDF文件转换成图片格式 具体方法参见文章&#xff1a;《零代码编程&#xff1a;用kimichat将图片版PDF自动批量分割成多个图片》 第二步&#xff1a;识别图片中的…

Springboot之Actuator的渗透

1. env http://ip:8080/actuator/env GET 请求 /env 会直接泄露环境变量、内网地址、配置中的用户名等信息&#xff1b;当程序员的属性名命名不规范&#xff0c;例如 password 写成 psasword、pwd 时&#xff0c;会泄露密码明文&#xff1b; 2.heapdump Heapdump地址为http…

互联网轻量级框架整合之JavaEE基础II

编写本篇代码并实际执行之前请仔细阅读前一篇互联网轻量级框架整合之JavaEE基础I Servlet 在Servlet容器中&#xff0c;Servlet是最基础的组件&#xff0c;也可以把JSP当做Servlet&#xff0c;JSP的存在意义只在于方便编写动态页面&#xff0c;使Java语言能和HTML相互结合&…

深度学习-计算机视觉入门-part1

计算机视觉入门 文章目录 计算机视觉入门一、 从卷积到卷积神经网络1.图像的基本表示2. 卷积操作3.卷积遇见深度学习3.1 通过学习寻找卷积核3.2 参数共享&#xff1a;卷积带来参数量骤减3.3 稀疏交互&#xff1a;获取更深入的特征 二、手撕卷积代码三、经典CNN模型介绍四、CNN模…