【Go开发】Go语言结构体,与java类不一样的定义方式

embedded/2024/9/20 5:20:10/ 标签: java, golang, python, 构造体, 构造函数, Formatting, go

文章目录

  • 一、引言
  • 二、Go语言结构体的定义
  • 三、Go语言结构体的用途
    • 1. 封装数据
    • 2. 提高代码可读性和可维护性
    • 3. 实现面向对象编程
  • 四、Go语言结构体与Java实体类的区别
    • 1. 定义方式
    • 2. 继承
    • 3. 访问修饰符
    • 4. 方法
    • 5. 构造函数
  • 总结

一、引言

在编程语言中,结构体(struct)是一种非常重要的数据类型,它允许我们将多个不同类型的数据项组合成一个单一的实体。Go语言作为一种静态类型、编译型和并发型语言,其结构体在开发过程中扮演着重要角色。本文将详细介绍Go语言结构体的定义、用途,以及与Java实体类的区别。

二、Go语言结构体的定义

  1. 结构体声明
    在Go语言中,结构体是一种自定义的数据类型,用于表示具有多个字段的对象。定义结构体使用关键字struct,如下所示:
go">type Person struct {Name stringAge  int
}

上述代码定义了一个名为Person的结构体,包含两个字段:Name(字符串类型)和Age(整型)。
2. 结构体实例化
定义结构体后,我们可以通过以下方式实例化一个结构体变量:

go">person := Person{Name: "Alice", Age: 30}

三、Go语言结构体的用途

1. 封装数据

结构体可以将多个相关数据项组织在一起,便于管理和维护。例如,在处理人员信息时,我们可以将姓名、年龄、性别等数据封装为一个Person结构体。

2. 提高代码可读性和可维护性

通过结构体,我们可以将复杂的业务逻辑拆分成多个简单的函数,每个函数负责处理结构体的一个字段。这样做有助于提高代码的可读性和可维护性。

3. 实现面向对象编程

Go语言虽然不是纯粹的面向对象编程语言,但结构体可以实现面向对象的一些特性,如封装、继承(通过组合)和多态(通过接口)。

四、Go语言结构体与Java实体类的区别

1. 定义方式

Go语言结构体使用struct关键字定义,而Java实体类使用class关键字定义。

2. 继承

Go语言结构体不支持继承,但可以通过组合(嵌入其他结构体)实现类似继承的效果。Java实体类支持继承,可以通过extends关键字实现。
嵌套:

go">package mainimport "fmt"// Address 结构体定义了地址信息
type Address struct {City    stringState   stringZipCode string
}// Employee 结构体定义了员工信息,并嵌套了Address结构体
type Employee struct {ID        intName      stringPosition  stringAddress   Address // 嵌套结构体
}func main() {// 创建一个Employee实例,同时初始化嵌套的Address结构体emp := Employee{ID:       1,Name:     "John Doe",Position: "Software Engineer",Address: Address{City:    "San Francisco",State:   "CA",ZipCode: "94111",},}// 打印Employee实例的详细信息fmt.Printf("Employee: %+v\n", emp)
}

3. 访问修饰符

Go语言结构体的字段默认为公开(public),没有访问修饰符。Java实体类的字段默认为私有(private),需要使用publicprivateprotected等访问修饰符来指定访问级别。

4. 方法

Go语言结构体可以定义方法,但方法只能定义在结构体类型上,不能定义在结构体实例上。Java实体类可以定义实例方法和类方法,且方法可以定义在类和实例上。
结构体(struct)定义方法的方式是通过为结构体类型定义一个接收器(receiver)来实现的。接收器是一个特殊参数,它在方法签名中位于func关键字和方法名之间。以下是定义结构体及其方法的步骤:

  • 定义结构体:首先,你需要定义一个结构体类型。
  • 定义方法:然后,你可以为该结构体定义一个或多个方法。

下面是一个具体的例子:

go">// 定义一个名为Person的结构体
type Person struct {Name stringAge  int
}
// 定义一个名为Speak的方法,该方法有一个Person类型的接收器
func (p Person) Speak() {fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}
// 定义一个名为Birthday的方法,该方法修改接收器的Age字段
func (p *Person) Birthday() {p.Age++ // 由于接收器是指针类型,这里可以直接修改结构体的字段
}
func main() {// 创建一个Person实例person := Person{Name: "Alice", Age: 30}// 调用Speak方法person.Speak()// 调用Birthday方法person.Birthday()// 再次调用Speak方法,查看年龄是否增加person.Speak()
}

在上面的例子中:

  • Speak 方法有一个 Person 类型的接收器。这意味着这个方法可以被任何 Person 类型的变量调用。
  • Birthday 方法有一个 *Person 类型的接收器,这是一个指向 Person 的指针。使用指针作为接收器可以让你直接修改结构体的字段,而不需要复制整个结构体。

关于接收器的类型(值接收器或指针接收器),以下是一些指导原则:

  • 值接收器:如果你不需要修改结构体的字段,或者结构体很小,使用值接收器是合适的。
  • 指针接收器:如果你需要修改结构体的字段,或者结构体很大,使用指针接收器可以避免复制结构体,从而提高性能。

在Go语言中,结构体方法是一种非常常见的模式,用于将行为和数据封装在一起。

5. 构造函数

Java实体类有显式的构造函数,用于初始化实例。
在Go语言中,没有内置的构造函数概念,但是可以通过自定义函数来实现类似构造函数的功能。这些函数通常命名为NewXXXNew,其中XXX是结构体名称。构造函数的目的是初始化结构体实例,并返回其指针。
下面是如何在Go中定义和使用结构体构造函数的步骤:

  1. 定义结构体:首先,你需要定义一个结构体类型。
  2. 编写构造函数:然后,编写一个函数,该函数接收所需的参数,并返回指向新创建的结构体实例的指针。
    下面是一个具体的例子:
go">package main
import "fmt"
// 定义一个名为Person的结构体
type Person struct {Name stringAge  int
}
// NewPerson是Person结构体的构造函数
// 它接收名字和年龄作为参数,并返回一个新的Person实例的指针
func NewPerson(name string, age int) *Person {return &Person{Name: name,Age:  age,}
}
func main() {// 使用NewPerson构造函数创建一个新的Person实例person := NewPerson("Alice", 30)// 输出person的详细信息fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}

在上面的例子中:

  • Person 结构体有两个字段:NameAge
  • NewPerson 函数是一个构造函数,它接收nameage两个参数,并返回一个指向新创建的Person实例的指针。
    构造函数的一些最佳实践:
  • 命名约定:通常使用NewXXX的命名方式,其中XXX是结构体的名称。
  • 返回指针构造函数通常返回结构体的指针,这样可以在函数外部修改变量的值,并且可以避免大结构体的不必要复制。
  • 初始化字段构造函数负责初始化结构体的所有字段,确保创建的实例处于有效状态。
  • 可选参数构造函数可以包含默认值,也可以使用可变参数或配置结构体来处理可选参数。

构造函数在Go中是一种重要的模式,它有助于创建一致且易于管理的代码结构。

总结

Go语言结构体作为一种复合数据类型,在开发过程中具有广泛的应用。了解其定义、用途及与Java实体类的区别,有助于我们更好地运用Go语言进行编程。在实际项目中,应根据业务需求和场景选择合适的结构体设计,以提高代码质量和开发效率。


http://www.ppmy.cn/embedded/112937.html

相关文章

使用mlp算法对Digits数据集进行分类

程序功能 这个程序使用多层感知机(MLP)对 Digits 数据集进行分类。程序将数据集分为训练集和测试集,创建并训练一个具有两个隐藏层的 MLP 模型。训练完成后,模型对测试数据进行预测,并通过准确率、分类报告和混淆矩阵…

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会(“CIOE中国光博会”)今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来,驱动应用创新”为主题,吸引了全球超过3700家优质光电企业参展,展示了光电产业的最新成果和前沿技术。 电…

魔方财务安装指南

本文将详细介绍魔方财务的安装、升级和迁移过程,确保您能够顺利地部署和使用魔方财务系统。 服务器配置一览表 以下是魔方财务1.0.0及更高版本的最低和推荐系统要求: 需求名称推荐配置最低要求OSCentOS/Debian/UbuntuLinux(不要使用window…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

大数据-128 - Flink 并行度设置 细节详解 全局、作业、算子、Slot

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【Kubernetes】常见面试题汇总(九)

目录 25.简述 Kubernetes 初始化容器(init container)? 26.简述 Kubernetes deployment 升级过程? 27.简述 Kubernetes deployment 升级策略? 28.简述 Kubernetes Daemonset 类型的资源特性? 25.简述 Ku…

vue原理分析(十二)研究new Vue()中的 initInjections

在Vue.prototype._init 中有一些init函数,今天我们来研究这些init函数 Vue.prototype._init function (options) {......{initProxy(vm);}......initLifecycle(vm);initEvents(vm);initRender(vm);callHook$1(vm, beforeCreate, undefined, false /* setContext *…

如何优化 Redis 底层命令执行流程以提高性能?

如何优化 Redis 底层命令执行流程以提高性能? 一、客户端优化 连接池管理 使用连接池来管理与 Redis 服务器的连接。这样可以避免频繁地创建和销毁连接,减少连接建立的开销。连接池可以根据实际的负载情况调整连接数量,确保在高并发情况下有足够的连接可用,同时避免过多的…

数据时代,职场离不开的远程控制工具

中秋了大概率是在正常放假了吧,如果突发遇到需要你处理的文件怎么办呢?其实有远程操作工具你就不用到办公室了。向日葵远程控制软件这些工具就可以帮我们远程实现控制电脑操作。如果你也有这方面需求就继续看吧,这次我将介绍几款我用过效果比…

dedecms靶场(四种webshell姿势)

进入靶场 姿势一:过文件管理器上传WebShell 步骤一:登录后台 /dede 步骤二:核心-》文件式管理-》文件上传-》上传一句话木马 点击 步骤三:进行蚁剑连接 姿势二:修改模板文件拿WebShell 步骤一:模板-》默认…

设计模式-行为型模式-备忘录模式

1.备忘录模式定义 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态; 1.1 备忘录模式的优缺点 优点 提供了一种状态恢复的实现机制,使得用户可以…

综合案例-数据可视化-柱状图

一、基础柱状图 我们绘制一个关于三种水果销售额的柱状图,X轴数据为三种水果的名称,用列表[苹果,香蕉,橘子]添加进去,Y轴数据为三种水果的销售额,用列表[50,70,60]添加进去。 步骤: 导包构建柱状图对象添加X轴数据生…

力扣第200题 岛屿数量

前言 记录一下刷题历程 力扣第200题 岛屿数量 岛屿数量 原题目: 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平…

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载: 先去clickhouse官网进行下载,继续往下翻找文档,将DBeaver也下载下来 下载地址:https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…

使用docker Desktop docker build 报错 无法拉取 nginx 镜像

具体报错信息:ERROR: failed to solve: nginxinc/nginx-unprivileged:alpine: failed to resolve source metadata for docker.io/nginxinc/nginx-unprivileged:alpine: failed to authorize: failed to fetch oauth token: Post "https://auth.docker.io/toke…

STM32—I2C

1.I2C I2C总线(Inter l0 BUs)是由Philips公司开发的一种通用数据总线两根通信线:SCL(Serial Clock)、SDA(Serial Data)同步,半双工带数据应答支持总线挂载多设备(一主多从、多主多从) MPU6050模块:可以进行姿态测量,使用了12C通信协议 第3个…

k8s环境下的相关操作

9.12 k8s calico的部署 # lsanaconda-ks.cfg k8s-ha-install kubeadm-config.yaml new.yaml token# 切换 git 分⽀[rootk8s-master ~]# cd k8s-ha-install/[rootk8s-master k8s-ha-install]# git checkout manual-installation-v1.28.x && cd calico/分支 manual…

Elasticsearch之bool查询

bool 查询是 Elasticsearch 中最常用的复合查询类型,允许将多个查询组合在一起。它通过逻辑操作符(如 must、should、must_not 和 filter)来构建复杂的查询条件,从而满足多条件匹配、逻辑与(AND)、或&#…

Unity多国语言支持

Unity多国语言支持 项目在我的课程 ”淘金城堡“ 中应用 项目的地址:http://t.csdnimg.cn/m0hFd 一、基本概念 在Unity中加入多国语言的支持可以让我们发布的游戏或应用上线在拥有不同语言的国家或地区。 下面介绍一款Unity官方提供的插件“Localization package…

物联网之发光二极管案例集合、Arduino的头文件、一个文件与多文件相比较、LED灯的各种显示、封装响应文件和内容、分文件

MENU 单文件头文件(分文件)移动端 单文件 #include <WiFi.h> #include <WebServer.h> #include <ArduinoJson.h>const char* ssid "jifu"; const char* pass "2022xinchan!#";const int DT10 10; const int DT300 300; const int D…