【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

在这里插入图片描述

嗨,Go语言学习者们!在编程的世界里,数据是核心,而结构体(Struct)是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中,我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌套、方法以及与面向对象编程的关系,带你逐步领略结构体的魅力。

结构体:理解自定义类型

在Go语言中,结构体是一种自定义的数据类型,它允许我们将不同类型的数据字段(属性)组合在一起,形成一个自洽的数据结构。想象一下,你正在构建一个人的模型,你可以用结构体来描述一个人的姓名、年龄和地址等信息,让数据更有意义和结构。

定义结构体

在Go语言中,我们使用type关键字来定义一个新的自定义类型,其中结构体就是其中之一。一个结构体定义由字段组成,每个字段都有一个类型和一个字段名。

package main

import "fmt"

// 定义一个名为Person的结构体
type Person struct {
    FirstName string
    LastName  string
    Age       int
}

func main() {
    // 使用结构体创建一个Person对象
    p := Person{
        FirstName: "Alice",
        LastName:  "Smith",
        Age:       30,
    }

    fmt.Println(p.FirstName, p.LastName)
}

结构体的初始化

结构体可以使用两种方式进行初始化:基于字段的初始化和值的列表初始化。

package main

import "fmt"

type Point struct {
    X int
    Y int
}

func main() {
    // 基于字段的初始化
    p1 := Point{X: 1, Y: 2}

    // 值的列表初始化
    p2 := Point{3, 4}

    fmt.Println(p1, p2)
}

嵌套结构体

在结构体中,字段的类型可以是任意类型,包括其他结构体。这种嵌套结构体的方式可以构建更复杂的数据结构。

package main

import "fmt"

type Address struct {
    City  string
    State string
}

type Person struct {
    FirstName string
    LastName  string
    Age       int
    Address   Address // 嵌套Address结构体
}

func main() {
    p := Person{
        FirstName: "Alice",
        LastName:  "Smith",
        Age:       30,
        Address: Address{
            City:  "New York",
            State: "NY",
        },
    }

    fmt.Println(p.FirstName, p.Address.City)
}

结构体方法

在Go语言中,我们可以为结构体定义方法,让结构体具有行为。方法是一种特殊类型的函数,它可以操作结构体的数据,从而实现更强大的功能。

package main

import "fmt"

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

func main() {
    c := Circle{Radius: 5}
    fmt.Println("Circle area:", c.Area())
}

与面向对象编程的关系

结构体和面向对象编程的思想有着紧密的联系。通过结构体和方法,我们可以在Go语言中实现面向对象的特性,尽管Go相对于其他语言来说更加简洁。通过组合、封装和方法,我们可以构建出更有组织、可维护和可扩展的程序。

与其他语言的对比

与一些传统的面向对象语言相比,Go语言在结构体和类的定义上有一些区别。Go语言没有类的概念,而是通过结构体和方法来实现类似的功能。此外,Go语言的方法接收者可以是指针类型或值类型,这使得在方法内部是否能修改结构体字段有所不同。

注意事项

在使用结构体时,有一些注意事项需要牢记:

  1. 内存布局: 结构体的字段在内存中按照定义的顺序依次排列。这可以影响内存对齐和性能,特别是在涉及大量结构体实例的情况下。

  2. 嵌套结构体的可见性: 嵌套结构体的字段在外部结构体外部是不可见的,无法直接访问。需要通过外部结构体的实例进行访问。

  3. 字段命名冲突: 如果两个嵌套结构体拥有同名字段,访问时需要指定完整的嵌套路径。

  4. 方法接收者选择: 在设计方法时,需要根据是否需要修改接收者的字段来选择值类型还是指针类型的接收者。

总结

结构体是Go语言中的一个强大工具,能够帮助我们定义自定义类型,并以更有结构的方式存储和操作数据。通过结构体的嵌套、方法和与面向对象编程的结合,我们可以构建出更加灵活和强大的应用程序。无论是创建简单的数据模型还是构建复杂的数据结构,结构体都是不可或缺的。

在你的学习过程中,记住以下几点:

  • 自定义类型:结构体允许你创建自己的数据类型,将不同的数据字段组合在一起。
  • 初始化:你可以通过字段名的初始化或者值的列表初始化来创建结构体对象。
  • 嵌套结构体:结构体可以嵌套其他结构体,形成更复杂的数据结构。
  • 方法:结构体可以拥有方法,让结构体具有更强大的行为。
  • 面向对象编程:Go语言中的结构体和方法使得面向对象编程的思想能够在代码中得以体现。

掌握结构体的概念和用法,将带给你更多的可能性和灵感,让你在编写Go程序时更加得心应手。无论是构建小型应用还是大型系统,结构体都是你编程旅程中的得力伙伴!

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

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

相关文章

Docker修改容器ulimit的全部方案及各方案的详细步骤

要修改Docker容器的ulimit(用户资源限制),有以下三种方案,每个方案的详细步骤如下: 方案一:在Dockerfile中设置ulimit 打开您的Dockerfile。在文件中添加以下命令来修改ulimit:RUN ulimit -n …

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main,但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入,也可以导入后指定包名, import ("fmt"godemo "githu…

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用,在 windows 系统上,打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文,则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下,在 windows 系统打完的 mis 包…

低代码的探索之路

Gartner发布报告指出,2023年全球低代码开发平台市场规模将达到345亿美元,比2022年增长20%。 目前,国内外已经有许多低代码平台,包括OutSystems、Mendix、Appian、Microsoft Power App等。这些平台提供了丰富的功能和工具&#xff…

无涯教程-JavaScript - PERCENTILE函数

PERCENTILE函数替代Excel 2010中的PERCENTILE.INC函数。 描述 该函数返回范围中值的第k个百分位数。您可以使用此功能建立接受阈值。 语法 PERCENTILE (array,k)争论 Argument描述Required/OptionalArrayThe array or range of data that defines relative standing.Requi…

如何使用C++11原子操作实现自旋锁

什么是自旋锁? C自旋锁是一种低层次的同步原语,用于保护共享资源的访问。自旋锁是一种轻量级的锁,适用于短时间的资源锁定。 自旋锁的特点:当一个线程尝试获取已经被另一个线程占有的自旋锁时,这个线程会进入一个循环…

【前端入门案例1】HTML + CSS

案例一 <!DOCTYPE html> <html lang"en-US"><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width"><title>My test page</title> </head><body><…

图:有向无环图(DAG)

1.有向无环图的定义 有向无环图:若一个有向图中不存在环&#xff0c;则称为有向无环图。 简称DAG图(Directed Acyclic Graph) 顶点中不可能出现重复的操作数。 2.有向无环图的应用 1.描述算数表达式 用有向无环图描述算术表达式。 解题步骤&#xff1a; 把各个操作数不重…

springboot web开发整合Freemarker 模板引擎

目录 Freemarker添加依赖配置文件ymlcontrollerhtml Freemarker 简介&#xff1a; FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具…

详解 Vue 3 使用了 Proxy 对象来替代 Vue 2 中的 Object.defineProperty

在 Vue 2 中&#xff0c;响应式系统使用了 Object.defineProperty 来实现属性的劫持和监听。这种方式需要在对象上定义 getter 和 setter&#xff0c;以便在属性被访问或修改时触发相应的操作。 然而&#xff0c;Object.defineProperty 有一些限制和性能问题。它只能劫持对象的…

mysql‘逻辑删除‘和‘唯一索引‘冲突的解决方案

一、冲突出现原因 在user表中将name字段设置唯一索引&#xff0c;添加逻辑删除字段del_flag&#xff08;1为删除&#xff0c;0为未删除&#xff09;之后&#xff0c;将name张四的字段删除&#xff0c;再添加一个name张四的记录则会出现冲突 二、解决 1.设置唯一索引组&#x…

【深度学习】ChatGPT

本文基于Andrej Karpathy(OpenAI 联合创始人&#xff0c;曾担任特斯拉的人工智能和自动驾驶视觉主管)在Microsoft Build 2023上的演讲整理而成&#xff08;完整的视频在文末&#xff0c;直接拖到文章底部&#xff09;&#xff0c;主要分为2大部分&#xff1a; 1.如何训练GPT(可…

前后端项目部署上线详细笔记

部署 参考文章&#xff1a;如何部署网站&#xff1f;来比比谁的方法多 - 哔哩哔哩大家好&#xff0c;我是鱼皮&#xff0c;不知道朋友们有没有试着部署过自己开发的网站呢&#xff1f;其实部署网站非常简单&#xff0c;而且有非常多的花样。这篇文章就给大家分享几种主流的前端…

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL&#xff0c;MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…

VBA_MF系列技术资料1-172

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

《Flink学习笔记》——第一章 概念及背景

​ 什么是批处理和流处理&#xff0c;然后由传统数据处理架构为背景引出什么是有状态的流处理&#xff0c;为什么需要流处理&#xff0c;而什么又是有状态的流处理。进而再讲解流处理的发展和演变。而Flink作为新一代的流处理器&#xff0c;它有什么优势&#xff1f;它的相关背…

渗透测试漏洞原理之---【任意文件上传漏洞】

文章目录 1、任意文件上传概述1.1、漏洞成因1.2、漏洞危害 2、WebShell解析2.1、Shell2.2、WebShell2.2.1、大马2.2.2、小马2.2.3、GetShell 3、任意文件上传攻防3.1、毫无检测3.1.1、源代码3.1.2、代码审计3.1.3、靶场试炼 3.2、黑白名单策略3.2.1、文件检测3.2.2、后缀名黑名…

经纬恒润荣获吉利汽车“最佳价值贡献”奖

8月18日&#xff0c;以“全面向新 共创共赢”为主题&#xff0c;吉利汽车在宁波成功举行2023年电子电器核心供应商恳谈会。经纬恒润凭借在项目合作上持续创新、高效协同等优异表现&#xff0c;获得“最佳价值贡献”奖项。 作为国产汽车代表性品牌之一&#xff0c;吉利汽车积极推…

单元测试及其工具Junit

1.单元测试是什么 单元测试是开发者编写的一小段代码&#xff0c;用于检验被测代码的一个很小的、很明确的功能是否正确&#xff0c;通常而言&#xff0c;一个单元测试是用于判断某个特定条件&#xff08;或者场景&#xff09;下某个特定函数的行为。 单元测试是软件测试的一种…

2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;区间合并 给定 n 个闭区间 [ai; bi]&#xff0c;其中i1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如&#xff0c;[1;2] 和 [2;3] 可以合并为 [1;3]&#xff0c;[1;3] 和 [2;4] 可以…