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

【新人系列】Golang 入门(十二):指针和结构体 - 上

✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html
📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Golang 的学习。在这个 Golang 的新人系列专栏下,将会总结 Golang 入门基础的一些知识点,并由浅入深的学习这些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪

1. 指针

1.1 指针的定义和初始化

定义:

type Person struct {name string
}func changeName(p *Person) {p.name = "imooc"
}func main() {p := Person {name:"bobby",}changeName(&p)fmt.Println(p.name)    //imooc
}

初始化:

//方法1
ps := &Person {}//方法2
var emptyPerson Person
ps := &emptyPerson//方法3
var ps = new(Person)

注意:

  1. 指针初始化推荐使用 new 函数。
  2. 指针要初始化,否则会出现 nil pointer。

通过 swap 交换指针的值:

func swap1(a, b *int) {a, b = b, a
}func swap2(a, b *int) {t := *a*a = *b*b = t
}func main() {a, b := 1, 2swap1(&a, &b)fmt.Println(a, b)    //1 2c, d := 1, 2swap2(&c, &d)fmt.Println(c, d)    //2 1
}

注意:
swap1 并不能真正交换两个指针的值,因为它只是交换了两个指针的地址,但其中的值并没有改变。故需要和普通变量交换方法一样,即 swap2 要通过一个临时变量进行交换。

1.2 nil 在 go 中的细节

不同类型的数据零值不一样:

  1. bool:flase
  2. numbers:0
  3. string:“”
  4. pointer、slice、map、channel、interface、function:nil

slice 的默认值:

var ps1 []Person //nil slice -> ps1 == nil
var ps2 = make([]Person,0)    //empty slice -> ps2 != nil

之所以 ps2 不为 nil,是因为它的 slice 结构体中的指针已经不指向 nil,即使分配的空间为 0,它仍然会指向一个分配好的地方。

在这里插入图片描述

注意:
map 和 slice 同理,即 m = make(map[string]string, 0) 中的 m 也不等于 nil,它是 empty map。

2. 结构体

2.1 type 关键字

在 Go 语言中,type是一个重要而且常用的关键字。它可以用于定义结构体、类型别名、方法等。

2.1.1 定义结构体

type person struct { name string // 注意后面不能有逗号 age  int 
}

2.1.2 定义类型别名、类型定义

//定义类型别名 - 别名实际上是为了更好的理解代码
type MyInt = int
var i MyInt = 12
var int = 8
fmt.Println(i + j)
fmt.Printf("%T", i)    //int//类型定义
type MyInt int
var i MyInt = 12
var j int = 8    //j不能和i直接相加,因为类型不同
fmt.Println(int(i) + j)    //需要强制类型转换
fmt.Printf("%T", i)        //main.MyInt

注意:
在编译的时候,类型别名会被直接替换成对应类型。

自定义类型的应用场景:

可以定义方法,扩展能力,从而使自定义类型能够调用原始类型没有的方法。

type MyInt intfunc (mi MyInt) string() string {return strconv.Itoa(int(mi))
}//调用
var i MyInt = 12
fmt.Println(i.string())

2.1.3 定义方法

type name string 
func (n name) len() int { return len(n) 
}

2.1.4 类型判断

var a interface{} = "abc"
switch a.(type) {
case string:fmt.Println("字符串")
}

2.2 结构体的定义和初始化

结构体(Struct)是一种将不同类型的数据组合在一起的复合数据类型。

结构体可以包含各种类型的字段,例如整数、浮点数、字符串、布尔值,甚至其他结构体或指针等。

2.2.1 定义

type Person struct {name stringage intaddress stringheight float32
}

2.2.2 初始化

//方法1
p1 := Person {"bobby1", 18, "慕课网", 1.80}//方法2
p2 := Person {name:"bobby2",height:1.78,
}

注意:
初始化方法 1 需要将所有值给初始化,方法 2 则可以只初始化部分值,并且可以选择初始值。

2.2.3 匿名结构体

address := struct {province stringcity stringaddress string
}{"北京市","通州区","xxx",
}

2.2.4 结构体嵌套

type Student struct {p Personscore floast32
}s := Student {Person {"bobby", 18,},95.6,
}fmt.Println(s.p.age)

2.2.5 匿名嵌套

type Student struct {Person    //这里直接写结构体名称score floast32
}s := Student {Person {"bobby", 18,},95.6,
}fmt.Println(s.age)    //用的时候就不用加p了

相关文章:

【新人系列】Golang 入门(十二):指针和结构体 - 上

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html 📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们…...

Day20 -实例:红蓝队优秀集成式信息打点工具的配置使用

一、自动化-企业查询 ----ENScan 原理:集成企查查、爱企查、chinaz等,剑指hw/src。 1)首次使用先创建config文件 确认一下生成了 2)配置cookie 各个平台不一样,根据github作者的教程来【放入github收藏夹了】 我这…...

MySQL学习笔记五

第七章数据过滤 7.1组合WHERE子句 7.1.1AND操作符 输入&#xff1a; SELECT first_name, last_name, salary FROM employees WHERE salary < 4800 AND department_id 60; 输出&#xff1a; 说明&#xff1a;MySQL允许使用多个WHERE子句&#xff0c;可以以AND子句或OR…...

Python爬虫第5节-urllib的异常处理、链接解析及 Robots 协议分析

目录 一、处理异常 1.1 URLError 1.2 HTTPError 二、解析链接 2.1 urlparse() 2.2 urlunparse() 2.3 urlsplit() 2.4 urlunsplit() 2.5 urljoin() 2.6 urlencode() 2.7 parse_qs() 2.8 parse_qsl() 2.9 quote() 2.10 unquote() 三、分析网站Robots协议 3.1 R…...

26届Java暑期实习面经,腾讯视频一面

短链接的生成原理 如何解决短链接生成的哈希冲突问题 如何加快从短链接到原链接的重定向过程 TCP 和 UDP 协议 如何理解 TCP 是面向连接的 为什么 TCP 的握手是 3 次 IO 模式 是否有真正写过一个底层的 Socket 通信 MySQL 的事务隔离级别 MVCC 机制 什么叫服务的并行 为什么能基…...

Kafka负载均衡挑战解决

本文为 How We Solve Load Balancing Challenges in Apache Kafka 阅读笔记 kafka通过利用分区来在多个队列中分配消息来实现并行性。然而每条消息都有不同的处理负载&#xff0c;也具有不同的消费速率&#xff0c;这样就有可能负载不均衡&#xff0c;从而使得瓶颈、延迟问题和…...

前端性能优化的全方位方案【待进一步结合项目】

以下是前端性能优化的全方位方案&#xff0c;结合代码配置和最佳实践&#xff0c;涵盖从代码编写到部署的全流程优化&#xff1a; 一、代码层面优化 1. HTML结构优化 <!-- 语义化标签减少嵌套 --> <header><nav>...</nav> </header> <main&…...

2025年第二期PMP考试中文报名时间定了!

近日&#xff0c;官方发布了《关于2025年6月15日PMI认证考试的报名通知》。根据通知&#xff0c;中国大陆地区2025年第二期PMI认证考试将于6月15日举行&#xff0c;中文报名将于4月17日正式开始。 一、报名安排 为缓解报名高峰期的网络拥堵&#xff0c;本次考试将采取分地区、…...

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章&#xff1a;ECIR 2025会议 一、动机 背景&#xff1a;利用LLMs强大的能力&#xff0c;将一个查询&#xff08;query&#xff09;和一组候选段落作为输入&#xff0c;整体考虑这些段落的相关性&#xff0c;并对它们进行排序。 先前的研究基础上进行扩展 [14,15]&#xff0c…...

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识 1. 引言 在微服务架构中&#xff0c;分布式事务处理是一个不可避免的挑战。随着业务复杂度的提升&#xff0c;单体应用逐渐演变为微服务架构&#xff0c;而分布式事…...

源码分析之Leaflet图层控制控件Control.Layers实现原理

概述 本文将介绍Leaflet库中最后一个组件&#xff0c;即图层控制组件 Control.Layers。 源码实现 export var Layers Control.extend({options: {collapsed: true,position: "topright",autoZIndex: true,hideSingleBase: false,sortLayers: false,sortFunction:…...

嵌入式软硬件开发,常见通信总线

嵌入式通信总线分类与应用指南 一、片上/板级通信接口&#xff08;内部互联&#xff09; I2C总线 核心特性 同步半双工传输&#xff0c;SCL时钟线SDA数据线7/10位地址寻址&#xff0c;支持多主多从架构标准模式100kbps&#xff0c;高速模式3.4Mbps&#xff0c;超高速模式5Mbps…...

[ERROR] Some problems were encountered while processing the POMs

记录一次maven的错误 问题复现&#xff1a; 我在ruoyi-vue-plus项目的ruoyi-modules中新建了一个子项目ruoyi-network-telphonem,然后某一次编译的时候提示SysTenantServiceImpl找不到无参的构造函数&#xff0c;检查了很久都没发现问题&#xff0c;于是我想着删掉本地maven仓…...

Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行?

环境&#xff1a; Ubuntu 20.04 LTS 问题描述&#xff1a; Ubuntu 服务器上运行相关命令&#xff0c;关闭终端就停止服务&#xff0c;怎么才能启动后在后台运行&#xff1f; bash docker/entrypoint.sh解决方案&#xff1a; bash docker/entrypoint.sh 脚本在后台运行&…...

前端工具方法整理

文章目录 1.在数组中找到匹配项&#xff0c;然后创建新对象2.对象转JSON字符串3.JSON字符串转JSON对象4.有个响应式对象&#xff0c;然后想清空所有属性5.判断参数不为空6.格式化字符串7.解析数组内容用逗号拼接 1.在数组中找到匹配项&#xff0c;然后创建新对象 const modifi…...

关于Deepseek本地AI知识文档库被联网访问方法的探索

背景&#xff1a; 根据前面的文章&#xff0c;我们使用了anythingLLM搭建了本地知识库&#xff0c;这个虽然基本可以用了&#xff0c;但是你只能在anythingLLM的界面里面进行提问&#xff0c;自能自己用&#xff0c;那么能否让其他人也可以使用我们搭建的本地知识库呢根据我的…...

一个简单的跨平台Python GUI自动化 AutoPy

象一下&#xff0c;你坐在电脑前&#xff0c;手指轻轻一点&#xff0c;鼠标自己动了起来&#xff0c;键盘仿佛被无形的手操控&#xff0c;屏幕上的任务自动完成——这一切不需要你费力&#xff0c;只靠几行代码就能实现。这就是AutoPy的魅力&#xff0c;一个简单却强大的跨平台…...

面试题汇总06-场景题线上问题排查难点亮点

面试题汇总06-场景题&线上问题排查&难点亮点 【一】场景题【1】订单到期关闭如何实现【2】每天100w次登录请求,4C8G机器如何做JVM调优?(1)问题描述和分析(2)堆内存设置(3)垃圾收集器选择(4)各区大小设置(5)添加必要的日志【3】如果你的业务量突然提升100倍…...

【嵌入式系统设计师】知识点:第4章 嵌入式系统软件基础知识

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...

基于RDK X3的“校史通“机器人:SLAM导航+智能交互,让校史馆活起来!

视频标题&#xff1a; 【校史馆の新晋顶流】RDK X3机器人&#xff1a;导览员看了直呼内卷 视频文案&#xff1a; 跑得贼稳团队用RDK X3整了个大活——给校史馆造了个"社牛"机器人&#xff01; 基于RDK X3开发板实现智能导航与语音交互SLAM技术让机器人自主避障不…...

春芽儿智能跳绳:以创新技术引领运动健康新潮流

在全球运动健康产业蓬勃发展的浪潮中&#xff0c;智能健身器材正成为连接科技与生活的重要纽带。据《中国体育用品产业发展报告》显示&#xff0c;2023年中国智能运动装备市场规模突破千亿元&#xff0c;其中跳绳类目因兼具大众普及性与技术升级空间&#xff0c;年均增速超30%。…...

复活之我会二分

文章目录 整数二分模板模板1&#xff1a;满足条件的第一个数模板2&#xff1a;满足条件的最后一个数 浮点数二分模板一、Building an Aquarium思路分析具体代码 二、Tracking Segments思路分析具体代码 三、Wooden Toy Festival思路分析具体代码 四、路标设置思路分析具体代码 …...

NOA是什么?国内自动驾驶技术的现状是怎么样的?

国内自动驾驶技术的现状如何&#xff1f; 汽车的NOA指的是“Navigate on Autopilot”&#xff0c;即导航辅助驾驶或领航辅助驾驶。这是一种高级驾驶辅助系统&#xff08;ADAS&#xff09;的功能&#xff0c;它允许车辆在设定好起点和终点后&#xff0c;自动完成行驶、超车、变…...

秒杀系统的性能优化

秒杀任务总体QPS预期是每秒几十万&#xff0c;对tomcat、redis、JVM参数进行优化。 tomcat线程数 4核8G的机器&#xff0c;一般就是开200-300个工作线程&#xff0c;这是个经验值。每秒一个线程处理3-5个请求&#xff0c;200多个线程的QPS可以达到1000左右。线程不能太多&…...

Linux 指令初探:开启终端世界的大门

前言 当我们初次接触 Linux&#xff0c;往往会被一串串在黑底屏幕中跳动的字符震撼甚至吓退。然而&#xff0c;正是这些看似晦涩的命令&#xff0c;构建了服务器、嵌入式系统乃至云计算的世界。 本篇将带你从最基础的 Linux 指令开始&#xff0c;逐步揭开命令行的神秘面纱。从…...

Edge浏览器IE兼容模式设置

一、了解Edge浏览器的IE模式 Microsoft Edge&#xff0c;作为微软推出的新一代浏览器&#xff0c;不仅拥有更快的浏览速度、更强大的安全性能以及更现代的界面设计&#xff0c;还巧妙地解决了与旧网站和应用程序的兼容性问题。通过内置的IE模式&#xff0c;Edge能够模拟IE浏览器…...

文件中魔数

当然可以&#xff0c;来讲几个实际开发中魔数会“救你一命”的场景&#xff0c;帮助你更直观地理解它的作用。 &#x1f3af; 场景 1&#xff1a;误读取非 SST 文件 假设你有一段代码在扫描一个目录&#xff0c;尝试打开所有 .sst 后缀的文件并加载&#xff1a; cpp 复制 编辑…...

制定大运维管理体系的标准、流程、机制、规范

规划并制定大运维管理体系的标准、流程、机制、规范&#xff0c;对于确保平台的可用性和稳定性至关重要。这一过程涉及从顶层设计到具体执行的全面考量&#xff0c;需要综合考虑业务需求、技术架构、团队能力等多方面因素。以下是一个基本框架&#xff0c;用于指导如何构建有效…...

算法初识-时间复杂度空间复杂度

注&#xff1a;观看Adbul Bari算法视频 算法概念 算法&#xff1a;先验分析&#xff0c;不依托于硬件&#xff0c;无语言限制&#xff0c;逻辑。 程序&#xff1a;后验测试&#xff0c;依托硬件&#xff0c;语言限制&#xff0c;实现。 特点&#xff1a; 输入-0或多个输出-至…...

Python高阶函数-sorted(深度解析从原理到实战)

一、sorted()函数概述 sorted()是Python内置的高阶函数&#xff0c;用于对可迭代对象进行排序操作。与列表的sort()方法不同&#xff0c;sorted()会返回一个新的已排序列表&#xff0c;而不改变原数据。 基本语法 sorted(iterable, *, keyNone, reverseFalse)二、核心参数详…...