网站建设与维护 唐清安/网络顾问

网站建设与维护 唐清安,网络顾问,深圳企业建设网站,简单flash网站模板整体介绍 虽然 Go 语言不是传统意义上的面向对象语言,但它提供了结构体(struct)来组织数据,并且可以为结构体绑定方法,从而达到面向对象的部分效果。 关键知识点包括: 结构体定义与实例化 定义结构体时使用…

整体介绍

虽然 Go 语言不是传统意义上的面向对象语言,但它提供了结构体(struct)来组织数据,并且可以为结构体绑定方法,从而达到面向对象的部分效果。
关键知识点包括:

  • 结构体定义与实例化

    • 定义结构体时使用 type ... struct{} 语法,字段可以是各种数据类型。
    • 实例化结构体可以使用字面量、new 函数或匿名结构体语法。
  • 方法绑定

    • 为结构体绑定方法时可以选择值接收者或指针接收者。
    • 值接收者方法操作的是副本,指针接收者方法可以修改原始数据。
  • 匿名结构体

    • 无需单独定义类型,定义时直接实例化。
    • 匿名字段:结构体中直接嵌入字段(类型名作为字段名),简化代码。
  • 空结构体

    • 空结构体 struct{} 占用 0 内存,可用于实现方法接收者、作为集合的值(类似只有 key 的字典)或作为信号通道的数据类型。

接下来按照这些知识点整理代码示例。


1. 结构体的定义与实例化

1.1 定义结构体和使用字面量实例化(指针类型和非指针类型)

代码示例:

// 文件名: 01_struct_definition.go
package mainimport "fmt"// 定义一个结构体 Student
type Student struct {id     intname   stringage    intschool string
}func main() {// 使用字面量实例化结构体,并取指针(指针类型实例)pan := &Student{id:     1,name:   "luobozi",age:    18,school: "znlsw",}// 使用指针访问字段(语法糖支持直接 . 操作)fmt.Println("pan.name:", pan.name)// 修改字段pan.age = 20fmt.Printf("pan: %+v\n", pan)// 直接实例化结构体(值类型实例)bo := Student{id:   3,name: "luobozi",age:  18,}fmt.Printf("bo: %+v\n", bo)
}

说明:

  • 使用 &Student{...} 得到结构体指针;直接写 Student{...} 得到值类型实例。
  • 使用字面量可以直接初始化各个字段。

1.2 使用 new 函数实例化结构体

代码示例:

// 文件名: 01_struct_new.go
package mainimport "fmt"type Student struct {id   intname stringage  int
}func main() {// 使用 new 函数实例化,返回的是指针类型luo := new(Student)luo.id = 2luo.name = "luobozi"fmt.Printf("luo: %+v\n", luo)
}

说明:

  • new(Student) 分配内存并返回指针,适用于结构体实例化;与字面量方式相比,new 返回的所有字段都是零值。

2. 值类型与指针类型的赋值

代码示例:

// 文件名: 01_struct_assignment.go
package mainimport "fmt"type Student struct {id   intname stringage  int
}func main() {// 指针类型赋值:两个指针引用同一对象,修改其中一个会影响另一方luo := new(Student)luo.id = 2luo.name = "luobozi"luo2 := luoluo.id = 999fmt.Println("luo2.id:", luo2.id, "luo.id:", luo.id)// 值类型赋值:会拷贝一份数据,互不影响bo := Student{id:   3,name: "luobozi",age:  18,}bo2 := bobo2.name = "张三"fmt.Println("bo2.name:", bo2.name, "bo.name:", bo.name)
}

说明:

  • 指针赋值只是复制地址,值类型赋值会拷贝整个结构体数据。

3. 方法绑定(值接收者与指针接收者)

代码示例:

// 文件名: 01_struct_method.go
package mainimport "fmt"type Student struct {id   intname stringage  int
}// 值接收者方法:对副本操作,修改不会反映到原变量
func (s Student) ChangeName(name string) {fmt.Println("调用方法 ChangeName (值接收者)")s.name = name
}// 指针接收者方法:修改原结构体数据
func (s *Student) ChangeName2(name string) {fmt.Println("调用方法 ChangeName2 (指针接收者)")s.name = name
}func main() {bo := Student{id:   3,name: "luobozi",age:  18,}luo := new(Student)luo.id = 2luo.name = "luobozi"// 调用值接收者方法(修改不会影响原变量)bo.ChangeName("milamn")fmt.Println("bo after ChangeName:", bo)// 调用指针接收者方法(原变量被修改)luo.ChangeName("luji")fmt.Println("luo after ChangeName (值方式调用):", luo)luo.ChangeName2("mikod")fmt.Println("luo after ChangeName2:", luo)
}

说明:

  • 使用值接收者时,方法操作的是结构体副本;而指针接收者方法可以直接修改原数据。

4. 匿名结构体

代码示例:

// 文件名: 01_struct_anonymous.go
package mainimport "fmt"func main() {// 定义并实例化匿名结构体,不需要提前定义类型abc := struct {abcid   intabcaddr string}{abcid:   10,abcaddr: "长沙",}fmt.Println("匿名结构体 abcaddr:", abc.abcaddr)
}

说明:

  • 匿名结构体适用于一次性使用,不需要复用结构体类型的场景。

5. 匿名字段

代码示例:

// 文件名: 01_struct_anonymousField.go
package mainimport "fmt"// 定义结构体时,直接嵌入类型作为匿名字段
type Person struct {stringint
}func main() {// 匿名字段的赋值按照字段顺序进行qwe := Person{"niming", 2,}fmt.Printf("匿名字段 Person: %+v\n", qwe)
}

说明:

  • 匿名字段使得结构体中的字段没有显式的名字,访问时直接用类型名(或通过顺序),可以简化代码结构。

6. 空结构体及其应用

6.1 空结构体作为方法接收者

代码示例:

// 文件名: 01_struct_empty.go
package mainimport "fmt"// 定义空结构体 Temp
type Temp struct{}func (t *Temp) Call() {fmt.Println("call for temp")
}func main() {t := &Temp{}t.Call()
}

说明:

  • 空结构体 struct{} 占用内存为 0,经常用作占位符或实现接口的方法接收者。

6.2 空结构体实现集合(Set)

代码示例:

// 文件名: 01_struct_set.go
package mainimport "fmt"// 定义 Set 类型,其本质上是 map[string]struct{},空结构体不占用内存
type Set map[string]struct{}// 为 Set 添加元素
func (s Set) Append(k string) {s[k] = struct{}{}
}func main() {s := make(Set)s.Append("hello")s.Append("world")// 输出集合中所有的 keyfor key := range s {fmt.Println("set key:", key)}
}

说明:

  • 使用 map[string]struct{} 实现集合(只关心 key,value 为空结构体),这种方式占用内存极小,非常适合存储唯一且不可重复的键。

总结

本篇笔记涵盖了 Go 语言中结构体的核心知识点:

  1. 结构体定义与实例化:包括指针与值的实例化方式以及使用 new 和字面量。
  2. 赋值方式:指针赋值(共享同一内存)与值赋值(拷贝数据)。
  3. 方法绑定:值接收者与指针接收者的区别。
  4. 匿名结构体:直接定义并实例化一次性使用。
  5. 匿名字段:在结构体中嵌入类型作为字段。
  6. 空结构体及集合应用:空结构体用于方法接收者、占位或实现集合。

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

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

相关文章

Three.js 快速入门教程【十八】射线拾取模型——鼠标点击屏幕选中模型或物体

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

探索抓包利器ProxyPin,实现手机APP请求抓包,支持https请求

以下是ProxyPin的简单介绍: - ProxyPin是一个开源免费HTTP(S)流量捕获神器,支持 Windows、Mac、Android、IOS、Linux 全平台系统- 可以使用它来拦截、检查并重写HTTP(S)流量,支持捕获各种应用的网络请求。ProxyPin基于Flutter开发&#xff0…

深入浅出Spring-Boot-3.x.pdf

通过网盘分享的文件:深入浅出Spring-Boot-3.x.pdf 链接: https://pan.baidu.com/s/10ZkhmeIXphEwND9Rv4EBlg?pwduatm 提取码: uatm

springboot启动事件CommandLineRunner使用

什么是CommandRunner CommandRunner是springboot启动完成时会调用的一个runner 启动参数会传递到这个runner 我们能用来做一些初始化工作和缓存预热等工作 ApplicationRunner VS CommandRunner? 这两个Runner作用一样 只是得到的启动参数格式不一样 前者是一个Argument对象…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具,而 TensorBoardX 是其社区驱动的替代品,支持 PyTorch 等其他框架。以下是它…

26考研——树与二叉树_树与二叉树的应用(5)

408答疑 文章目录 三、树与二叉树的应用哈夫曼树和哈夫曼编码哈夫曼树的定义概念带权路径长度(WPL)计算示例分析 哈夫曼树的构造算法描述哈夫曼树的性质示例 哈夫曼编码Huffman树的编码规则Huffman树的构建过程前缀编码前缀编码的分析及应用 Huffman树的…

【VUE】day06 动态组件 插槽 自定义指令 ESlint

【VUE】day06 动态组件 & 插槽 & 自定义指令 1. 动态组件1.1 通过不同的按钮展示不同的组件1.1.1回顾click 1.2 keep-alive的使用1.3 keep-alive对应的生命周期函数1.3.1 keep-alive的include属性1.3.2 exclude 1.4 组件注册名称和组件声明时name的区别1.4.1 组件声明时…

nodejs-原型污染链

还是老规矩,边写边学,先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…

26考研——图_图的代码实操(6)

408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…

开源webmail邮箱客户端rainloop的分支版本SnappyMail 设置发件人允许多重身份

RainLoop已多年未更新,SnappyMail 是 RainLoop 的分支,由社区维护。SnappyMail 不仅修复了漏洞,还增加了更多功能和优化。对 IMAP 支持更好,移动端体验也比 RainLoop 更细致。 安装过程和设置跟RainLoop一样: 以宝塔面…

海量数据场景题--查找两个大文件的URL

查找两个大文件共同的URL 给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,找出 a、b 两个文件共同的 URL。内存限制是 4G。 操作逻辑: 使用哈希函数 hash(URL) % 1000​ 将每个URL映射到0-999的编号 文件A切割为a0, a1…

简单ELK框架搭建

简介 ELK 框架是一套开源的日志管理和分析工具,由 Elasticsearch、Logstash 和 Kibana 三个主要组件组成,现在新增了Filebeat组件,可以更高效的收集数据。 Elasticsearch:是一个分布式、高可扩展的开源搜索引擎,能快速…

网络之数据链路层

数据链路层 数据链路层目标 TCP/IP提供了一种能力, 将数据可靠的从 B 跨网络送到 C 主机, 这期间是由无数次局域网转发构成的, 比如 主机B 到 路由器F 就是一次局域网通信的问题, 而数据链路层就是研究数据是如何在局域网内部转发的. 也就是说, 应用层是进行数据的处理, 传输…

基于大数据的各品牌手机销量数据可视化分析系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,各品牌手机销量数据可视化分析系统当然不能排除在外。基于大数据的各品牌手机销量数据可视化分析系统是在实际应用和软件工程的开发原理之…

人工智能-群晖Docker部署DB-GPT

人工智能-群晖Docker部署DB-GPT 0 环境及说明1 获取dbgpt的docker镜像2 下载向量模型3 下载配置文件4 修改配置文件5 创建dbgpt容器并运行6 访问dbgpt0 环境及说明 环境项说明DSM版本DSM 7.2.1-69057 update 3Container Manager版本24.0.2-1535当前 hub.docker.com 镜像仓库中的…

C++ --- 二叉搜索树

1 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树: 1 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值 2 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点…

跨语言语言模型预训练

摘要 最近的研究表明,生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中,我们将这一方法扩展到多种语言,并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型(XLM)的方法:一种…

AOA与TOA混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用EKF

本代码实现了一个基于 到达角(AOA) 和 到达时间(TOA) 的混合定位算法,结合 扩展卡尔曼滤波(EKF) 对三维运动目标的轨迹进行滤波优化。代码通过模拟动态目标与基站网络,展示了从信号测量、定位解算到轨迹滤波的全流程,适用于城市峡谷、室内等复杂环境下的定位研究。 文…

如何通过数据可视化提升管理效率

通过数据可视化提升管理效率的核心方法包括清晰展示关键指标、及时发现和解决问题、支持决策优化。其中,清晰展示关键指标尤为重要。通过数据可视化工具直观地呈现关键绩效指标(KPI),管理者能快速、准确地理解业务现状&#xff0c…

推陈换新系列————java8新特性(编程语言的文艺复兴)

文章目录 前言一、新特性秘籍二、Lambda表达式2.1 语法2.2 函数式接口2.3 内置函数式接口2.4 方法引用和构造器引用 三、Stream API3.1 基本概念3.2 实战3.3 优势 四、新的日期时间API4.1 核心概念与设计原则4.2 核心类详解4.2.1 LocalDate(本地日期)4.2…