Golang结构体入门

news2025/1/20 14:58:12

目录

结构体基础

结构体示例

为结构体定义方法

组合结构体

嵌套结构体

指针结构体

匿名字段

面向对象

封装

继承

多态


结构体基础

1.结构体是值类型:在Go语言中,结构体是一种值类型,与数组和基本数据类型一样。当结构体被赋值给一个变量或传递给一个函数时,它的值会被复制一份。因此,对复制的结构体进行修改不会影响原来的结构体。

2.结构体可以定义方法:在Go语言中,结构体可以定义方法,方法是与特定类型关联的函数,可以访问和操作结构体的字段。方法的定义语法与函数类似,但需要在函数名前加上接收者,接收者可以是值类型或指针类型。

3.结构体的字段可以使用标签:在Go语言中,可以给结构体的字段加上一个标签(tag),用来描述该字段的一些元数据信息,比如字段名、数据类型、校验规则等。标签的内容可以通过反射机制进行读取和修改。

4.结构体可以进行序列化和反序列化:在Go语言中,结构体可以通过序列化和反序列化的方式进行数据的编码和解码。序列化是将数据结构转换成二进制格式的过程,反序列化是将二进制格式的数据解析成数据结构的过程。常用的序列化方式包括JSON、XML、Protobuf等。

5.结构体字段的命名规范:在Go语言中,结构体字段的命名规范是使用驼峰命名法,即首字母小写,每个单词的首字母大写。这种命名方式可以提高代码的可读性和可维护性。

在Go语言中,结构体是一种自定义的数据类型,它由一组数据字段组成,每个字段可以是任意类型。结构体可以用于描述一些复杂的数据结构,比如记录、链表、树等。

结构体的定义如下:

type StructName struct {
    Field1 type1
    Field2 type2
    ...
    FieldN typeN
}

结构体示例

下面是一个结构体的示例:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{
        Name: "Tom", 
        Age: 20,
    }
    fmt.Println(p)
    fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}

在上面的示例中,我们定义了一个Person结构体,它包含两个字段:Name和Age。在main函数中,我们创建了一个Person类型的变量p,并初始化其Name和Age字段。最后,我们输出了这个变量的值,以及它的Name和Age字段的值。

为结构体定义方法

除了定义结构体之外,我们还可以为结构体定义方法。方法是一种与特定类型关联的函数,可以访问和操作结构体的字段。

下面是一个为Person结构体定义方法的示例:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s, and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    p := Person{
        Name: "Tom", 
        Age: 20,
    }
    p.SayHello()
}

在上面的示例中,我们为Person结构体定义了一个SayHello方法,该方法输出一个字符串,包含Person的Name和Age字段的值。在main函数中,我们创建了一个Person类型的变量p,并调用了它的SayHello方法。

组合结构体

Go语言中的结构体也可以通过组合来实现复用的功能,具体实现方法如下:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

type Student struct {
    P      Person // 组合了Person结构体
    School string
}

func main() {
    s := Student{
        Person{"Tom", 18}, 
        "High School",
    }
    fmt.Println(s.P.Name, s.P.Age, s.School) // 输出 Tom 18 High School
}

这段代码中定义了一个Person结构体,包含Name和Age两个字段,另外定义了一个Student结构体,它组合了Person结构体。在main函数中,我们通过构造函数创建了一个Student实例s,并访问了它的Name、Age和School字段,需要通过s.P来访问Person结构体中的字段。

通过组合其他结构体,子结构体可以复用父结构体中的字段和方法,但是它不会继承父结构体的特性和行为。与继承相比,组合更加灵活和简单,但也需要开发者更多的手动操作。

需要注意的是,Go语言中没有类的概念,因此结构体不是类,它不能实现继承和多态等面向对象的特性,而是一种数据类型的定义方式。

嵌套结构体

可以在结构体中嵌套另一个结构体,从而形成一个复合的结构体类型。嵌套结构体可以直接使用内部结构体的字段,也可以通过内部结构体名来访问内部结构体的字段。

例如:

package main

import "fmt"

type Address struct {
    Province string
    City     string
}

type Person struct {
    Name    string
    Age     int
    Address Address
}

func main() {
    p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
    fmt.Println(p.Name, p.Age, p.Address.Province, p.Address.City)
}

指针结构体

结构体变量通常会占用比较大的内存空间,为了节省内存,可以使用指针结构体。指针结构体可以通过&操作符获取结构体变量的地址,并通过*操作符访问结构体变量的值。

例如:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func mian() {
    p:= &Person{
        Name: "Tom", 
        Age: 18,
    }
    fmt.Println((*p).Name, (*p).Age) // 输出:Tom 18
    fmt.Println(p.Name, p.Age)       // 输出:Tom 18
}

匿名字段

可以将一个结构体类型作为另一个结构体类型的字段,这个字段就称为匿名字段。匿名字段的类型可以是任意类型,可以是基本类型、结构体类型、指针类型等。匿名字段可以直接访问内部结构体的字段,也可以通过内部结构体名来访问内部结构体的字段。

例如:

package main

import "fmt"

type Address struct {
    Province string
    City     string
}

type Person struct {
    Name string
    Age  int
    Address
}

func main() {
    p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
    fmt.Println(p.Name, p.Age, p.Province, p.City)
}

面向对象

Go语言虽然不是一种纯面向对象编程语言,但它提供了一些面向对象编程的基本特性,比如封装、继承和多态等。

封装

Go语言通过大写字母开头的字段或方法来实现封装,这些字段或方法可以在包外部访问。小写字母开头的字段或方法则只能在当前包内部访问。

例如:

package main

import "fmt"

type Person struct {
    name string
    age int
}

func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}

func main() {
    p := &Person{"Tom", 18}
    p.SayHello()
}

在上面的代码中,我们定义了一个名为Person的结构体,它有两个字段name和age,并且定义了一个方法SayHello,用于打印个人信息。在main函数中,我们创建了一个Person对象p,并调用它的SayHello方法,输出了它的信息。

继承

Go语言不支持传统的继承方式,但是可以通过结构体组合的方式实现继承。具体来说,我们可以在一个结构体中包含另一个结构体,并通过嵌套结构体的方式来继承其字段和方法。

例如:

package main

import "fmt"

type Person struct {
    name string
    age  int
}

func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}

type Student struct {
    Person
    score int
}

func main() {
    s := &Student{Person{"Tom", 18}, 90}
    s.SayHello()
    fmt.Println("My score is", s.score)
}

在上面的代码中,我们定义了两个结构体Person和Student,Student结构体包含了一个Person类型的字段,并且定义了一个自己的score字段。在main函数中,我们创建了一个Student对象s,并调用它的SayHello方法,输出了它的信息,然后输出了它的成绩。

多态

Go语言不支持传统的多态方式,但是可以通过接口实现多态。具体来说,我们可以定义一个接口,并让不同的结构体实现这个接口,从而实现多态。

例如:

package main

import "fmt"

type Animal interface {
    Say()
}

type Cat struct{}

func (c *Cat) Say() {
    fmt.Println("Meow!")
}

type Dog struct{}

func (d *Dog) Say() {
    fmt.Println("Woof!")
}

func main() {
    var a Animal
    a = &Cat{}
    a.Say()

    a = &Dog{}
    a.Say()
}

这段Go语言代码定义了一个Animal接口和两个实现了该接口的结构体:Cat和Dog。Animal接口中只有一个Say()方法。Cat和Dog分别实现了Say()方法并输出相应的声音。在main函数中,定义了一个a变量,类型为Animal接口。首先将a赋值为一个Cat结构体的指针,然后调用a的Say()方法输出"Meow!"。接着将a赋值为一个Dog结构体的指针,再次调用a的Say()方法输出"Woof!"。

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

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

相关文章

【MySQL】MySQL批量插入测试数据的几种方式

文章目录 前言一、表二、使用函数生成设置允许创建函数产生随机字符串产生随机数字 三、创建存储过程插入角色表插入用户表 四、执行存储过程小结五、使用 Navicat自带的数据生成 前言 在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某…

企业为什么要数字化转型?

数字化转型是使用数字技术从根本上改变企业运营方式并为客户创造价值的过程。企业进行数字化转型,常见因素包括: 提高效率:数字化转型可以简化流程并自动执行重复性任务,从而减少执行这些任务所需的时间和精力。可以节省成本并提高…

网页三剑客之 Javascript

JavaScript (简称 JS) 是世界上最流行的编程语言之一是一个脚本语言, 通过解释器运行主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行 其实,语言都是触类旁通的,我们学过了C语言和JavaSE,那么学起其他任何语言都不难&a…

CSS 中的常用属性(图文详解版)

CSS 中的常用属性 🔎引入方式🔎CSS 选择器🔎字体🔎文本🔎背景🔎圆角矩形🔎元素的显示模式🔎CSS 盒模型🔎弹性布局🔎结尾 CSS 中的属性有很多 本文列举了一些较…

Spark大数据处理讲课笔记4.4 Spark SQL数据源 - JSON数据集

文章目录 零、本讲学习目标一、读取JSON文件概述二、读取JSON文件案例演示(一)创建JSON文件并上传到HDFS(二)读取JSON文件,创建临时表,进行关联查询1、读取user.json文件,创建临时表t_user2、读…

Liunx下的进程信号

文章目录 前言1.信号初识前置知识2.信号产生的方式1.键盘产生信号2.系统调用产生信号3.软件条件产生的信号4.硬件异常 3.信号的保存4.信号的处理1.用户态和内核态2.用户态和内核态的切换方式3.内核中信号的捕捉流程4.volatile关键字 前言 本文主要是对Liunx中进程信息进行讲解…

Spark大数据处理讲课笔记4.5 Spark SQL数据源 - Hive表

文章目录 零、本讲学习目标一、Spark SQL支持读写Hive二、Spark配置hive-site.xml三、准备工作(一)启动Hive的metastore(二)启动Spark Shell 四、Spark读写Hive数据(一)导入SparkSession(二&…

Spark大数据处理讲课笔记4.8 Spark SQL典型案例

文章目录 零、本讲学习目标一、使用Spark SQL实现词频统计(一)数据源 - words.txt(二)创建Maven项目(三)添加依赖和构建插件(四)修改源目录名称(五)创建日志属…

Linux——线程2|线程控制

什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。 一切进程至少都有一个执行线程 线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中,在CPU…

基于Java+SpringBoot+vue+node.js的智能农场管理系统详细设计和实现

基于JavaSpringBootvuenode.js的智能农场管理系统详细设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

报表设计器Stimulsoft 2023.2提供深色主题和 Monoline 图标包

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

【Vue】学习笔记-消息的订阅与发布

消息的订阅与发布(基本不用) 消息订阅与发布(pubsub)消息订阅与发布是一种组件间的通信的方式,适用于任意组件间通信 消息订阅与发布 1.订阅消息∶消息名 2.发布消息︰消息内容 消息订阅与发布的工作流程: (A是订阅者,B是发布…

软件安全开发意识

国务院印发的《“十四五”数字经济发展规划》中指出数字经济是继农业经济、工业经济之后的主要经济形态,是以数据资源为关键要素,以现代信息网络为主要载体,以信息通信技术融合应用、全要素数字化转型为重要推动力,促进公平与效率…

MYSQL高可用配置(MHA)

1、什么是MHA MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…

fastapi高性能异步框架,极速上手

fastapi项目开发快速上手 简介 FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6 并基于标准的 Python 类型提示。 特性: 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和…

全流程各工程类型地下水环境影响评价【一级】方法与MODFLOW Flex建模

目录 专题一 地下水基础知识学习 专题二 地下水环境影响评价过程讲解 专题三 地下水数值软件的学习及操作 专题四 相关专业软件(Surfer、Aquifer test)的学习 专题五 化工类建设项目地下水环评关键技术处理及上机操作 专题六 化工类建设项目地下水…

顶象助力如祺出行打造高品质服务

近日,广东省自然资源厅审批通过了如祺出行提交的测绘资质申请,如祺出行获得地理信息系统工程和互联网地图服务两个专业的乙级测绘资质。此次获批意味着,如祺出行能够在许可区域内依法合规开展数据标注和场景仿真等相关业务,构建全…

Oracle11g全新讲解之触发器和视图索引

触发器 1.触发器的基本讲解 当特定事件出现时自动执行的存储过程 语法结构 CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON table_or_view_name [REFERENCING {OLD [AS] old / NEW [AS]…

探索Jetpack Compose的Material You主题

探索Jetpack Compose的Material You主题 在本文中,我们将了解可用于 Jetpack Compose 的新 Material You 库,并了解我们如何将其动态颜色应用到 Stream Chat Compose SDK,以获得有趣、多彩和个性化的消息传递体验。 在本文中,您…

Spark大数据处理讲课笔记4.7 Spark SQL内置函数

文章目录 零、本讲学习目标一、Spark SQL内置函数(一)内置函数概述1、10类内置函数2、两种使用方式 (二)内置函数演示1、通过编程方式使用内置函数upper()2、通过SQL语句的方式使用内置函数upper()3、演示其它内置函数的使用 二、…