当前位置: 首页 > news >正文

9.1go结构体

Go不是完全面向对象的,没有类的概念,所以结构体应该承担了更多的责任。

结构体定义

使用 type 和 struct 关键字定义:

type Person struct {

        Name string

        Age int

}

字段可以是任意类型,包括其他结构体或指针。

字段名以大写开头表示可导出(公开),小写表示私有(仅在包内可见)。

实例化

方式一:声明变量后赋值

        var p1 Person

        p1.Name = "Alice"

        p1.Age = 30

方式二:结构体字面量

        p2 := Person{Name: "Bob", Age: 25} // 指定字段名

        p3 := Person{"Charlie", 28} // 按字段顺序初始化(需注意顺序)

方式三:使用 new 函数(返回指针)

        p4 := new(Person)

        p4.Name = "Dave" // Go自动解引用,等价于 (*p4).Name

结构体的零值

当声明一个结构体变量而不初始化时,其字段会被赋予对应类型的零值。

var u Person
fmt.Println(u.Name) // 输出: ""
fmt.Println(u.Age)  // 输出: 0

结构体的构造函数

虽然 Go 不支持传统的构造函数,但可以通过定义函数来创建并初始化结构体实例,通常命名为 New【StructName】

func NewPerson(name string, age int) Person {return Person{Name: name,Age:  age,}
}p := NewPerson("Laura", 32)
fmt.Println(p.Name) 

嵌套与匿名字段

结构体可以嵌套其他结构体,实现组合(类似继承):

type Employee struct {

        Person // 匿名字段(嵌入Person结构体)

        Position string

}

这样的话,Employee就嵌套了Person,访问Employee的Name可以直接用e.Name,而不需要e.Person.Name,这就是结构体嵌套匿名字段的作用。

// 访问嵌套字段

e := Employee{Person{"Eve", 40}, "Engineer"}

fmt.Println(e.Name) // 直接访问Person的字段(字段提升)

结构体方法

结构体可以定义方法,接收者为值或指针:

Go中的方法是在函数前面加上一个接收者。比如,给Person结构体定义一个方法:

这里要注意,如果使用值接收者,修改不会影响原结构体,而指针接收者会改变原结构体的值。

// 值接收者(操作副本)

// 指针接收者(操作原对象)

func main() {p := Person{Age:  29,Name: "Diana",}p.Birthday()fmt.Println(p.Age) // 输出: 29 (未改变)p.BirthdayPointer()fmt.Println(p.Age) // 输出: 30 (已改变)}type Person struct {Name stringAge  int
}// 值接收者
func (p Person) Birthday() {p.Age += 1
}// 指针接收者
func (p *Person) BirthdayPointer() {p.Age += 1
}

继承

Employee 结构体嵌入了 Person结构体,因此 Employee 可以直接访问 Person的字段和方法

    e := Employee{Person{"Eve", 40}, "Engineer"}fmt.Println(e.Name, e.Age)e.Birthday()fmt.Println(e.Name, e.Age)e.BirthdayPointer()fmt.Println(e.Name, e.Age)

结构体作为参数

结构体作为参数传递给函数,如果是值传递,函数内部对结构体的修改不会影响原变量;如果是传递指针,则会修改原变量。

  • 值传递(拷贝副本)

直接将结构体作为值传递给函数,函数内部操作的是原结构体的副本,不会影响原对象。

示例:

package main

import "fmt"

type Point struct {

        X int

        Y int

}

// 值传递:修改副本,不影响原对象

func modifyValue(p Point) {

        p.X = 100

        fmt.Println("Inside modifyValue:", p) // 输出 {100 2}

}

func main() {

        p := Point{X: 1, Y: 2}

        modifyValue(p)

        fmt.Println("After modifyValue:", p) // 输出 {1 2}(原对象未改变)

}

适用场景:

结构体较小,拷贝成本低。

不需要修改原结构体的逻辑。

  • 指针传递(操作原对象)

传递结构体的指针(内存地址),函数内部操作的是原对象。

示例:

package main

import "fmt"

type Point struct {

        X int

        Y int

}

// 指针传递:修改原对象

func modifyPointer(p *Point) {

        p.X = 100

        fmt.Println("Inside modifyPointer:", *p) // 输出 {100 2}

}

func main() {

        p := &Point{X: 1, Y: 2}

        modifyPointer(p)

        fmt.Println("After modifyPointer:", p) // 输出 &{100 2}(原对象已改变)

}

适用场景:

结构体较大,避免拷贝开销。

需要修改原结构体的字段。

结构体字段覆盖

package mainimport "fmt"type Person struct {Name stringAge  int
}type Employee struct {Person // 嵌入Person结构体Name   string // 与Person中的Name字段同名Salary float64
}func main() {e := Employee{Person: Person{Name: "Alice", Age: 30},Name:   "Eve",Salary: 70000,}fmt.Println(e.Name)          // 输出: Eve (外层Employee的Name字段)fmt.Println(e.Person.Name)   // 输出: Alice (内层Person的Name字段)fmt.Println(e.Age)           // 输出: 30fmt.Println(e.Salary)        // 输出: 70000
}
  • Employee 结构体嵌入了 Person 结构体,并且两者都有一个名为 Name 的字段。
  • 当访问 e.Name 时,默认访问的是 Employee 结构体的 Name 字段("Eve"),这遮蔽了内层 Person 的 Name 字段。
  • 要访问内层 Person 的 Name 字段,需要使用 e.Person.Name

结构体方法覆盖

package mainimport "fmt"type Person struct {Name string
}func (p Person) Greet() {fmt.Printf("Hello, I'm %s from Person.
", p.Name)
}type Employee struct {PersonName string
}func (e Employee) Greet() {fmt.Printf("Hello, I'm %s from Employee.
", e.Name)
}func main() {p := Person{Name: "Alice"}e := Employee{Person: Person{Name: "Bob"},Name:   "Eve",}p.Greet() // 输出: Hello, I'm Alice from Person.e.Greet() // 输出: Hello, I'm Eve from Employee.// 调用嵌入结构体的方法e.Person.Greet() // 输出: Hello, I'm Bob from Person.
}
  • Employee 结构体定义了自己的 Greet 方法,覆盖了嵌入的 Person 的 Greet 方法。
  • 调用 e.Greet() 会执行 Employee 的 Greet 方法。
  • 如果需要调用被遮蔽的 Person 的 Greet 方法,可以通过 e.Person.Greet() 显式调用。

结构体可见性

如果结构体的名称或字段的名称以大写字母开头,那么其他包可以访问;否则,只能在当前包内访问。比如:

type person struct { // 小写,只能在包内使用

          name string

          age int

}

type Student struct { // 大写,公开,包外可见

        Name string

        Age int

}

结构体其他特性

比较

若所有字段可比较(非切片、map等),结构体可直接用 == 或 != 比较。

包含不可比较字段的结构体无法直接比较。

深浅拷贝

默认赋值是值拷贝(深拷贝)。

若字段含引用类型(如切片、指针),拷贝后共享底层数据。

作为Map的键需所有字段可比较:

type Point struct { X, Y int }

points := make(map[Point]string)

points[Point{1,2}] = "start"

匿名字段冲突

若多个匿名字段有同名字段,需显式指定:

type A struct { Name string }

type B struct { Name string }

type C struct { A; B }

c := C{}

c.A.Name = "Alice" // 必须明确指定

相关文章:

9.1go结构体

Go不是完全面向对象的,没有类的概念,所以结构体应该承担了更多的责任。 结构体定义 使用 type 和 struct 关键字定义: type Person struct { Name string Age int } 字段可以是任意类型,包括其他结构体或指针。 字段名以大写…...

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境(一) 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面,如果Ubuntu剩余空间低于60G,则空间不足,除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…...

全星FMEA软件:汽车电子行业研发管理高效之选

全星FMEA软件:汽车电子行业研发管理高效之选 在汽车电子行业,FMEA(失效模式与影响分析)是确保产品质量和安全的关键工具。然而,传统的FMEA分析过程往往繁琐复杂,耗费大量时间和精力。 全星FMEA软件应运而生…...

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台 一、简单介绍 二、Docker 下载安…...

OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…...

RLock类详细介绍、应用场景和示例代码

概述 org.redisson.api.RLock 是 Redisson 提供的 分布式可重入锁(类似 ReentrantLock),基于 Redis 实现,常用于 分布式环境 下的 并发控制。 1. RLock 详解 🔹 特点 基于 Redis 实现,支持 集群环境。可…...

【HeadFirst系列之HeadFirst设计模式】第16天之生成器模式(Builder Pattern):让对象构建更优雅!

🚀 生成器模式(Builder Pattern):让对象构建更优雅! “遇到复杂对象构建?试试生成器模式!” 在日常开发中,我们经常会遇到 创建对象属性过多、构造方法过长、可选参数混乱 的问题。这…...

Browser Use+DeepSeek的使用教程

browser-use webui 主要功能 提供了全新的网页界面,简单好用,方便操作。 支持更多大语言模型,比如 Gemini、OpenAI、Azure 等,还有最近爆火的国产大模型 DeepSeek,未来还会加更多。 支持用自己的浏览器,不用…...

“此电脑”中删除WPS云盘方法(百度网盘通用)

📣此方法适用于卸载WPS云盘后,WPS云盘图标依然在此电脑中显示的问题。 原理:通过注册来进行删除 步骤: WIN键R,打开运行窗口,输入regedit命令,来打开【注册表编辑器】; 从左侧,依…...

1. 树莓派上配置机器人环境(具身智能机器人套件)

1. 安装树莓派系统 镜像下载地址(windows/Mac/Ubuntu),安装Pi5. 2. 环境配置(登录Pi系统) 2.1 启用 SSH From the Preferences menu, launch Raspberry Pi Configuration. Navigate to the Interfaces tab. Select Enable…...

正则表达式(2)匹配规则

正则表达式的匹配规则定义了如何识别字符串中的特定模式。这些规则包括字符类匹配、元字符匹配、数量词、字符转义和分组。 字符类匹配 字符类匹配允许你指定一个字符集合,并匹配该集合中的任意单个字符。这是通过方括号 [] 来实现的。 简单字符类:[abc…...

Golang实践录:go发布版本信息收集

go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多&#xf…...

go:windows环境下安装Go语言

1.下载 打开Go语言中文网下载页面: https://studygolang.com/dl 按照对应平台选择下载: https://studygolang.com/dl/golang/go1.19.2.windows-amd64.msi。 2.安装 双击下载好的文件 记下安装路径,删除末尾的反斜杠: C:\Program…...

遵义市招生管理信息系统的开发与实现

近年来,随着信息技术的发展,各类管理系统在教育领域得到广泛应用。本文将介绍如何开发一个基于Web的招生管理信息系统,以提高遵义市招生工作的效率和透明度。 系统架构设计 本系统采用典型的三层架构,包括表示层、业务逻辑层和数…...

Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

Pytest自动化框架

目录 Pytest简单介绍 第一章:Pytest console命令 1.pytest -v 参数 -h 参数 其他一些参数:仅供参考 第二章. mark标记 pytest.mark.skip pytest.mark.skipif pytest.mark.xfail ​编辑 pytest.mark.patametrize 单个参数 多个参数 直接…...

算法之 前缀和

文章目录 前缀和基础3427.变长子数组求和 前缀和与哈希表1524.和为奇数的子数组数目 距离和1685.有序数组中绝对值之和 前缀异或和1177.构建回文串检测 其他一维前缀和1310.子数组异或查询 二维前缀和1314.矩阵区域和 前缀和,就是定义pre[i] 为nums的前i个元素的和值…...

【Windows下Gitbook快速入门使用】

Windows下Gitbook快速入门使用 1 工具安装1.1 Node.js下载安装1.1 环境变量1.2 npm配置1.3 安装gitbook 2 gitbook使用2.1 gitbook 无法执行2.2 gitbook常用命令 Gitbook是一个软件,使用Git和Markdown来编排书本; GitBook helps you pushlish beautiful …...

python网络爬虫开发实战之基本库使用

目录 第二章 基本库的使用 2.1 urllib的使用 1 发送请求 2 处理异常 3 解析链接 4 分析Robots协议 2.2 requests的使用 1 准备工作 2 实例引入 3 GET请求 4 POST请求 5 响应 6 高级用法 2.3 正则表达式 1 实例引入 2 match 3 search 4 findall 5 sub 6 com…...

【hello git】git rebase、git merge、git stash、git cherry-pick

目录 一、git merge:保留了原有分支的提交结构 二、git rebase:提交分支更加整洁 三、git stash 四、git cherry-pick 共同点:将 一个分支的提交 合并到 到另一个上分支上去 一、git merge:保留了原有分支的提交结构 现有一个模型…...

deepseek、腾讯元宝deepseek R1、百度deepseekR1关系

分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…...

DeepSeek + 沉浸式翻译 打造智能翻译助手

本文详细介绍如何使用 DeepSeek API 沉浸式翻译插件打造个性化翻译助手。 一、DeepSeek API 配置 基础配置 API 基础地址:https://api.deepseek.com需要申请 API Key支持与 OpenAI SDK 兼容的调用方式 可用模型 deepseek-chat:已升级为 DeepSeek-V3&am…...

iOS 聊天 IM 消息收发管理工具

iOS 聊天 IM 消息收发管理工具 连续疯狂加班告一段落,趁着离职前夕的空闲时间,整理一下重构相关的文档。之前写过两篇文章 iOS 客户端 IM 以及列表 UI 框架 、iOS 客户端 IM 消息卡片插件化,突然发现时间过的真的很快,这都已经是…...

从零开始学习Slam--数学概念

正交矩阵 矩阵的转置等于它的逆矩阵,这样的矩阵称之为正交矩阵 即: Q T Q I Q^T Q I QTQI, 这样的矩阵列向量都是单位向量且两两正交。 旋转矩阵属于特殊的正交群,即SO(n),这里n通常是3,所以SO(3)就是…...

3.使用ElementUI搭建侧边栏及顶部栏

1. 安装ElementUI ElementUI是基于 Vue 2.0 的桌面端组件库。使用之前,需要在项目文件夹中安装ElementUI,在终端中输入以下命令,进行安装。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI组件进行页面布局 2.1 清空原…...

pandas-基础(数据结构及文件访问)

1 Pandas的数据结构 1.1 Series 特点:一维的数据型对象,包含一个值序列和数据标签(即索引) 创建Series: pandas.Series(dataNone, indexNone, dtypeNone, nameNone, copyFalse, fastpathFalse) 参数说明: data&a…...

windows下使用msys2编译ffmpeg

三种方法: 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译(有环境变量) 3、在msys2中使用visual studio编译(无环境变量) 我的环境: 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…...

Linux驱动开发(1.基础创建)

序言:从高层逻辑到底层硬件的回归 在当今的软件开发中,我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增,却也逐渐模糊了我们对计算机本质的认知:一切代码终将落地为…...

长短期记忆网络(LSTM)学习指南

长短期记忆网络(LSTM)学习指南 1. 定义和背景 长短期记忆网络(Long Short-Term Memory, LSTM)是一种递归神经网络(RNN)的变体,旨在解决传统RNN在处理长期依赖关系时遇到的梯度消失或爆炸问题。…...

蓝耘智算平台助力阿里万相2.1:文生图创作攻略

声明:非广告,为用户体验文章 目录 引言 一、认识蓝耘智算平台与阿里万相 2.1 (一)蓝耘智算平台概述 (二)阿里万相 2.1 文生图技术解析 二、蓝耘智算平台注册与环境准备 (一)注…...

HarmonyOS ArkTS声明式UI开发实战教程

引言:为何选择ArkTS? 在HarmonyOS生态快速发展的当下,ArkTS作为新一代声明式UI开发框架,正在引发移动应用开发范式的变革。笔者曾在多个跨平台框架开发中经历过"命令式编程之痛",直到接触ArkTS后才发现&…...

电脑总显示串口正在被占用处理方法

1.现象 在嵌入式开发过程中,有很多情况下要使用串口调试,其中485/422/232转usb串口是非常常见的做法。 根据协议,接口芯片不同,需要安装对应的驱动程序,比如ch340,cp2102,CDM212364等驱动。可…...

linux 安装nvidia 驱动所有发行版通用

之前有写过Ubuntu安装驱动的手册: https://blog.csdn.net/qq_50247813/article/details/146062785 到官网寻找合适的驱动: https://www.nvidia.cn/drivers/lookup 直接选择 linux 64-bit 适用于所有x86构架的linux,arm需要选择arm架构。 这次…...

PHP之数组

在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于数组的信息。 PHP中的数组不用指定数据类型,同时索引不一定是数字。 与其说是数组,其实更像map。 创建和输出 $arr array(1, 2, 3); $arr1 [1, 2, 3]; var_dump(…...

【js逆向】图灵爬虫练习平台 第十五题

地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvMTUv 不一样的两个值 hook cookie两次执行出现密文v值 最主要是这个函数 直接扣整个js代码,然后补环境即可,可以参考 同花顺那篇文章,有讲 关键代码 var rt;!funct…...

LeetCode 1328.破坏回文串:贪心

【LetMeFly】1328.破坏回文串:贪心 力扣题目链接:https://leetcode.cn/problems/break-a-palindrome/ 给你一个由小写英文字母组成的回文字符串 palindrome ,请你将其中 一个 字符用任意小写英文字母替换,使得结果字符串的 字典…...

【商城实战(11)】解锁商品搜索与筛选功能,提升用户购物体验

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配&#xf…...

Android AudioFlinger(五)—— 揭开AudioMixer面纱

前言: 在 Android 音频系统中,AudioMixer 是音频框架中一个关键的组件,用于处理多路音频流的混音操作。它主要存在于音频回放路径中,是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候,提到了一个函数pr…...

HTML-05NPM使用踩坑

2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷,然后一番折腾之后,终究还是没有解决npm的问题😞😞😞,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…...

并发编程——累加器

目录 1 AtomicLong 1.1 核心功能 1.2 实现原理: (1)基于 Unsafe 的底层操作 (2) volatile字段的内存可见性 (3)CAS 操作与 ABA 问题 1.3 性能分析 1.4 使用场景 2 LongAdder 核心设计原理 1 分段存储 2 分散更新策略 3.处理高竞…...

LeetCode - 28 找出字符串中第一个匹配项的下标

题目来源 28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode) 题目解析 暴力解法 本题如果采用暴力解法的话,可以定义两个指针 i,j,其中 i 指针用于扫描 S(haystack)串,j 指针…...

人机交互革命:从触屏到脑波的13维战争

人机交互革命:从触屏到脑波的13维战争 一、交互维度大爆炸:重新定义人机沟通边界 当ChatGPT开始解析你的微表情,当Neuralink芯片能读取皮层信号,人机交互已突破【键鼠】的次元壁。我们正经历人类史上最大规模的感官革命&#xff…...

如何查看Elastic-Job在Zookeeper中的注册信息

目录 使用zkCli.sh脚本 1. 连接ZooKeeper 2. 查看根目录 3. 查看具体作业的注册信息 4. 退出ZooKeeper客户端 使用ZooInspector工具 1.下载并安装ZooInspector: 2.连接到Zookeeper服务器: 3.浏览服务节点: 4.查看服务实例数据: 注…...

【数据库系统概论】事务

一、事务的定义 1.定义: 事务是数据库管理系统中的一个逻辑工作单元,它由一组操作组成,这些操作是数据库的增删查改的这种一些类的操作,这些操作要么全部成功,要么全部失败。逻辑工作单元是指在数据库中执行的一组操…...

FPGA 配置原理

用户编程控制的FPGA 是通过加载比特位流配置内部的存储单元实现的。该存储单元就是所谓的配置单元,它必须在器件上电后进行配置,从而设置查找表(LUT)的属性、连线方式、IOB 电压标准和其它的用户设计。 1.配置帧 以Xilinx 公司的…...

《DeepSeek MoE架构下,动态专家路由优化全解析》

在人工智能飞速发展的当下,模型架构的创新与优化始终是推动技术进步的关键力量。DeepSeek的混合专家模型(MoE)架构,以其独特的设计理念和卓越的性能表现,在大模型领域崭露头角。而其中的动态专家路由优化技术&#xff…...

ORA-01861一次奇怪的字符串格式匹配问题

客户的一个生产库服务器挂了,还好有容灾数据库,在把生产库切换到容灾库后,大部分的业务都恢复了,但是有一个上传数据的应用报错: ORA-01861:文字与格式字符串不匹配 这个报错呢以前遇到过好几次,基本都是date类型和字符串类型匹配的问题, 一般就是字段需要date类型的数据,但是…...

基于Spring Boot的校园失物招领系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

nlp进阶

1 Rnn RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构段计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出. 单层网络结构 在循环 rnn处理的过程 rnn类别 n - n n - 1 使用sigmoid 或者softmax处理 应用在分类中…...

不同类型光谱相机的技术差异比较

一、波段数量与连续性 ‌多光谱相机‌ 波段数:通常4-9个离散波段,光谱范围集中于400-1000nm‌。 数据特征:光谱呈阶梯状,无法连续覆盖,适用于中等精度需求场景(如植被分类)‌。 ‌高光谱相机…...