golang学习,小结
切片
切片,底层就是数组,len(切片的长度)和cap(容量,切片的空间)
从一个数组来得到切片,修改切片会修改原来的数组,数据会收到影响
我们可以通过内置的 append 函数对一个切片追加元素,返回新切片
append 函数可以有以上三种操作,你可以根据自己的实际需求进行选择,append 会自动处理切片容量不足需要扩容的问题。
小技巧:在创建新切片的时候,最好要让新切片的长度和容量一样,这样在追加操作的时候就会生成新的底层数组,从而和原有数组分离,就不会因为共用底层数组导致修改内容的时候影响多个切片。
map
Go 语言的 map 可以获取不存在的 K-V 键值对,如果 Key 不存在,返回的 Value 是该类型的零值,比如 int 的零值就是 0。所以很多时候,我们需要先判断 map 中的 Key 是否存在。
map 的 [] 操作符可以返回两个值:
- 第一个值是对应的 Value;
- 第二个值标记该 Key 是否存在,如果存在,它的值为 true。
和数组切片不一样,map 是没有容量的,它只有长度,也就是 map 的大小(键值对的个数)。要获取 map 的大小,使用内置的 len 函数
string和[]byte
字符串 string 也是一个不可变的字节序列,所以可以直接转为字节切片 []byte
而在 UTF8 编码下,一个汉字对应三个字节,把一个汉字当成一个长度计算,fmt.Println(utf8.RuneCountInString(s))
iota
包级别的函数:大写开头
可变参数:
函数返回参数:
闭包:
方法和函数是两个概念,但又非常相似,不同点在于方法必须要有一个接收者,这个接收者是一个类型,这样方法就和这个类型绑定在一起,称为这个类型的方法。
对象初始化:
如果要实现一个接口,必须实现这个接口提供的所有方法
以值类型接收者实现接口的时候,不管是类型本身,还是该类型的指针类型,都实现了该接口。
以指针类型接收者实现接口的时候,只有对应的指针类型才被认为实现了该接口。
如果重复了,应该还是A.B.C这样去取
在编程语言中,指针是一种数据类型,用来存储一个内存地址,该地址指向存储在该内存中的对象。这个对象可以是字符串、整数、函数或者你自定义的结构体。
指针变量的值就是它所指向数据的内存地址,普通变量的值就是我们具体存放的数据。
内置的 new 函数有一个参数,可以传递类型给它。它会返回对应的指针类型
虽然指向具体类型的指针可以实现一个接口
,但是指向接口的指针
永远不可能实现该接口。
那么为什么值类型在参数传递中无法修改呢?
Go 语言中的函数传参都是值传递。 值传递指的是传递原来数据的一份拷贝,而不是原来的数据本身
除了 struct 外,还有浮点型、整型、字符串、布尔、数组,这些都是值类型。
在 Go 语言中,任何创建 map 的代码(不管是字面量还是 make 函数)最终调用的都是 runtime.makemap 函数。
makemap 函数返回的是一个 *hmap 类型,也就是说返回的是一个指针,所以我们创建的 map 其实就是一个 *hmap。
因为 Go 语言的 map 类型本质上就是 *hmap,所以根据替换的原则,我刚刚定义的 modifyMap(p map) 函数其实就是 modifyMap(p *hmap)。这是不是和上一小节讲的指针类型的参数调用一样了?这也是通过 map 类型的参数可以修改原始数据的原因,因为它本质上就是个指针。
make 函数只用于 slice、chan 和 map 这三种内置类型的创建和初始化,因为这三种类型的结构比较复杂,比如 slice 要提前初始化好内部元素的类型,slice 的长度和容量等,这样才可以更好地使用它们。
在Go语言中,使用make
创建map与不使用make
创建map之间的区别主要体现在初始化和性能优化上。以下是这个领域最重要的20%的知识,以帮助你快速学习起80%:
使用make
创建map
-
初始化:使用
make
函数可以初始化map,使其不再是nil
,可以直接进行赋值操作。例如:m := make(map[string]int) m["key"] = 1
这种方式避免了
nil
map的陷阱。 -
性能优化:通过
make
函数创建map时,可以指定初始容量,这有助于减少map在运行时的扩容操作,从而提高效率。例如:m := make(map[string]int, 100) // 初始容量为100
这种方式可以优化性能。
-
代码简洁:使用
make
函数使得代码更加简洁易读。
不使用make
创建map
-
零值陷阱:如果直接声明一个map而不进行初始化,它将默认为
nil
。在这种情况下,尝试向map中添加键值对会导致运行时错误:var m map[string]int m["key"] = 1 // 这里会引发panic
运行上述代码会引发
panic
,因为m
是nil
,无法进行赋值操作。 -
必须初始化:为了避免运行时错误,必须使用
make
函数对map进行初始化。
通过掌握这些核心概念,你可以快速理解在Go语言中使用make
创建map与不使用make
创建map的区别。
在Go语言中,使用make
和new
创建map的区别主要体现在返回类型、初始化方式和适用场景上。以下是这个领域最重要的20%的知识,以帮助你快速学习起80%:
使用make
创建map
- 返回类型:
make
返回的是引用类型的实例,可以直接使用。 - 初始化:
make
会对引用类型进行初始化,创建的变量不是零值,而是根据类型进行初始化。 - 适用场景:
make
仅用于创建引用类型的变量,如切片、映射和通道。
使用new
创建map
- 返回类型:
new
返回的是指向值类型实例的指针。 - 初始化:
new
创建的变量是零值,需要进一步初始化才能使用。 - 适用场景:
new
用于创建任意类型的变量,但不适用于引用类型(如切片、映射和通道)
,只能用于值类型的创建。
区别总结
- 返回类型:
make
返回引用类型实例,new
返回指针。 - 初始化:
make
进行类型初始化,new
进行零值初始化。 - 内存分配:
make
分配并初始化内存,new
仅分配内存。
通过掌握这些核心概念,你可以快速理解在Go语言中使用make
和new
创建map的区别。
相关文章:
golang学习,小结
切片 切片,底层就是数组,len(切片的长度)和cap(容量,切片的空间) 从一个数组来得到切片,修改切片会修改原来的数组,数据会收到影响 我们可以通过内置的 append 函数对一…...
【C++ map和set】数据的吟游诗:Map与Set的双城记
公主请阅 set1.序列式容器和关联式容器2.set的介绍3.set的构造和迭代器部分set可以进行去重操作的,在去重的同时可以对插入进来的数字进行排序的操作4.set的增删查inserterasefindupper_bound和 lower_bound 5.multiset和set的差异6相关题目349.两个数组的交集142.环…...
leetcode 之 二分查找(java)(3)
文章目录 5. 81. 搜索旋转排序数组 II6. 378、有序矩阵中第k个小的元素 5. 81. 搜索旋转排序数组 II 题目描述: 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k&#…...
后端返回前端的数据量过大解决方案
后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格,部分表格采用虚拟滚动条 数据量有点大 接近快60s了,看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …...
STL算法之其它算法_下
random_shuffle 这个算法将[first,last)的元素次序随机排列。也就说,在N!中可能的元素排列中随机选出一种,此处N为last-first。 N个元素的序列,其排列方式为N!中,random_shuffle会产生一个均匀分布,因此任何一个排列被…...
MySQL如何区分幻读和不可重复读
在MySQL中,幻读和不可重复读都是并发事务中可能出现的问题,但它们的表现和原因略有不同。 不可重复读 (Non-Repeatable Read) 不可重复读是指在同一个事务内,多次读取同一行数据时,可能会得到不同的结果。这种情况发生在一个事务…...
html ul li 首页渲染多条数据 但只展示八条,其余的数据全部隐藏,通过icon图标 进行展示
<div style"float: left;" id"showMore"> 展开 </div> <div style"float: left;“id"hideLess"> 收起 </div> var data document.querySelectorAll(.allbox .item h3 a); const list document.querySelectorAl…...
Vue3安装 运行教程
本文是综合了所有vue安装教程而成 更细化 更简略 希望对各位读者有所帮助! Vue安装 1. Vue-cli脚手架安装 安装vue的方式有很多 我们这里选择npm方式安装vue npm方式 npm方式安装vue,详细介绍见下文。 1.node.js安装和配置 安装npm 需要安装note.js&…...
Spring事务的一道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。 原理 Spring事务的原理是:通过AOP切面的方式实现的,也就是通过代理模式去实现事务增强。 具体过程是&a…...
PHP SM4 加密
PHP SM4 加密 sm4基类 class Sm4 {private $ck [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,0xc0c7ced5, 0xdce3ea…...
群控系统服务端开发模式-应用开发-短信工厂腾讯云短信开发
一、腾讯云短信工厂开发 1、添加框架对应的SDK composer require tencentcloud/tencentcloud-sdk-php 2、添加腾讯云工厂 在根目录下extend文件夹下Sms文件夹下channel文件夹下,创建腾讯云短信发送工厂并命名为TencentSmsSender。记住,一定要在腾讯云短…...
vue key属性强制刷新组件
在 Vue 中,key 属性通常用来帮助 Vue 跟踪每个组件或元素的身份,尤其是在使用 v-for 渲染列表时。当 key 值发生变化时,Vue 会销毁并重新渲染组件,这也可以用于强制刷新组件。 如果你想强制刷新一个组件,可以通过动态…...
浪潮X86服务器NF5280、8480、5468、5270使用inter VROC Raid key给NVME磁盘做阵列
浪潮服务器inter VROC Raid key给NVME磁盘做阵列方法 Inter VROC技术简介Raid Key 授权,即VROC SKU兼容性处理器兼容性列表平台和芯片组兼容性列表各Raid级别最大磁盘数量硬盘型号操作系统 服务器上的操作安装Raid Key确认服务器能识别硬盘识别磁盘所在的通道及服务…...
最长最短单词
最长最短单词 C语言实现C实现Java实现Python实现 💐The Begin💐点点关注,收藏不迷路💐 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一…...
Muduo网络库剖析 --- 架构设计
文章目录 前言概述篇一、Muduo网络库简介Reactor事件处理模式 二、基于muduo实现简易聊天服务器实现测试运行 三、muduo的架构设计Reacor模式muduo框架架构解析主从Reactor工作流程主线程(main Reactor)工作线程(sub Reactor) 线程分配与负载均衡 四、总结线程分配与负载均衡 四…...
lwip raw、netcoon、socket三种接口编程的区别
目录 一、前言 二、LWIP 简介 三、LWIP RAW 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 四、LWIP NETCONN 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 五、LWIP SOCKET 编程 1.概念与原理 2.编程模型与流程 3.示例代码 …...
在办公室环境中用HMD替代传统显示器的优势
VR头戴式显示器(HMD)是进入虚拟现实环境的一把钥匙,拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域,正如如今的互联网一样,虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…...
P3916 图的遍历(Tarjan缩点和反向建边)
P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一:Tarjan 思路:先运用Tarjan算法得到每个连通块中最大的编号,然后对每个连通块进行缩点重新建图,进行dfs,得到缩点后的连通块能够达到的最大编号。 Code: conste…...
Element UI 的 el-tree 组件e中默认展开前两层,设置 default-expanded-keys 属性来实现
在使用 Element UI 的 el-tree 组件时,如果你希望默认展开树的前两层节点,可以通过设置 default-expanded-keys 属性来实现。这个属性接受一个数组,数组中的值是需要默认展开的节点的 key。 首先,你需要确保你的每个树节点都有唯…...
Vue 项目中未登录状态如何统一处理
在 Vue 项目中,处理未登录状态(比如用户访问需要登录的页面时)是一项常见的需求。为了实现这一需求,我们通常使用 Vue Router 配合 Vuex 或者 Vue 的全局状态管理来统一处理未登录的状态,确保用户只能访问允许的页面。…...
Java 集合:强大的数据管理工具
在 Java 编程中,集合是一种非常重要的工具,它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架,包括其主要类型、特点、用法以及一些最佳实践。 一、引言 在软件开发过程中,我们经常需要处理一组数据。…...
Creating Server TCP listening socket *:6379: bind: No error
启动redis报错:Creating Server TCP listening socket *:6379: bind: No error 解决方案: 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown,关闭 3、输exit,退出 4、重新输入 redis-server.exe redis.windows.conf&…...
iOS免费共享企业证书、苹果最新企业证书免费获取
前言 大家可能都注意到了,苹果手机和安卓手机在安装软件上有点不一样。如果你在苹果手机上想装那些没在官方商店(App Store)里的软件,那就得给它们“签个名”,就像是给它们盖个章,这样手机才能认识它们&am…...
如果用Python写爬虫,具体怎么实现随机请求间隔呢?
在Python中实现随机请求间隔,通常使用time.sleep()函数结合random模块来生成随机的等待时间。以下是一个具体的实现方法: 导入必要的模块 首先,你需要导入time和random模块: import time import random 设置随机间隔 然后&am…...
aws(学习笔记第十五课) 如何从灾难中恢复(recover)
aws(学习笔记第十五课) 如何从灾难中恢复 学习内容: 使用CloudWatch对服务器进行监视与恢复区域(region),可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…...
nginx4层限速
Nginx的功能概述 Nginx是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器等。它主要工作在7层(应用层),但在某些场景下也可以实现部分4层(传输层)的功能。 关于4层限速 Nginx自身的限制&#x…...
Spring Cloud Alibaba 之 “Feign多参数构造”
在上一篇文章整合好了Feign,现在来总结以下Feign调用多参数方法的使用。 GET方式: Spring Cloud为Feign支持了Spring Mvc注解的。如果请求的是localhost:8083/test?id1&namecoco,那么如果我们这样写(User实体类有这二个属性)…...
C#高级教程
目录 C# 特性(Attribute)C# 反射(Reflection)C# 属性(Property)C# 索引器(Indexer)C# 委托(Delegate)C# 事件(Event)C# 集合…...
c++ 位图和布隆过滤器
位图(bitmap) 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态,通常用于快速判断某个值是否存在,或者用来表示布尔类型的集合。 特点 节省空间:一个字节可以表示8个状态。高效操作:位操作…...
基于Springboot开发的云野旅游平台
一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后,可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后…...
微服务即时通讯系统(5)用户管理子服务,网关子服务
用户管理子服务(user文件) 用户管理子服务也是这个项目中的一个业务最多的子服务,接口多,但是主要涉及的数据表只有user表,Redis的键值对和ES的一个搜索引擎,主要功能是对用户的个人信息进行修改管理&#…...
docker.io连接超时的处理,用代理网站
docker pull的时候会超时: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这时可以找一些代理网站,比如…...
【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用
一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...
JavaScript 键盘控制移动
如果你想通过 JavaScript 实现键盘控制对象(比如一个方块)的移动,下面是一个简单的示例,展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS: <!DOCTYPE html> <html lang"en">…...
如何预防服务器后台爆破攻击
服务器后台爆破(Brute Force Attack)是一种通过反复尝试用户名和密码组合,以非法获取系统访问权限的攻击方式。这种攻击不仅会消耗服务器资源,还可能导致合法用户被锁定或敏感数据泄露。为了有效预防服务器后台爆破攻击࿰…...
AI 写作(一):开启创作新纪元(1/10)
一、AI 写作:重塑创作格局 在当今数字化高速发展的时代,AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位,发挥着不可替代的作用。 随着信息的爆炸式增长,人们对于内容的需求日益旺盛。AI 写作能够…...
【HarmonyOS】鸿蒙应用使用lottie动画
【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么? https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库,用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...
SQL面试题——腾讯SQL面试题 合并连续支付订单
合并连续支付订单 现有一张用户支付表:user_pay包含字段订单ID,用户ID,商户ID,支付时间,支付金额。如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。 +----------+------…...
【docker】10. 容器操作案例
容器操作案例 容器基本操作 • 通过 nginx 镜像文件创建容器 • 容器的列举(包含正在运行的容器) # 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态 rootLAPTOP-H2EI4I6A:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED …...
postman测试
当然,以下是针对你提供的API层和Service层代码中涉及到的各个接口,如何使用 Postman 进行详细测试的指南。这个指南将帮助你理解如何配置 Postman 来测试这些接口,包括请求的构造、认证的处理、以及如何解读响应。 目录 准备工作接口测试指…...
【攻防实验】溯源与取证分析实验
溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...
【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言
一、前言 在 JMeter 中,断言元件(Assertion)用于验证测试结果是否符合预期。断言元件可以检查服务器的响应数据,以确保它们符合期望的模式或值,从而验证性能测试脚本的正确性。断言元件通常在每个请求的响应中添加&am…...
Linux 常用命令
目录 一、ls 指令 二、pwd命令 三、cd 指令 1、cd 目录名 2、cd .. 返回上级目录 3、cd ~ 进入用户家目 4、cd - 返回最近访问目录 5、cd相对路径&&cd绝对路径 四、touch指令 五、mkdir指令 1、mkdir 目录名 创建一个目录 2、mkdir -p 递归创建多…...
汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction
概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…...
003-SpringBoot整合Pagehelper
SpringBoot整合Pagehelper 一、引入依赖二、配置 application.yml三、配置 MybatisPlusConfig四、Controller五、ServiceImpl 一、引入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</ar…...
零基础学安全--shell练习
目录 用shell写一个计算器 测试 一些小问题 n阶乘数 测试 拓展 写⼀个Shell脚本去筛选出eth0⽹卡的ipv4地址,并赋值⼀个变量输出 测试 无限重启 用shell写一个计算器 read -p "请输入数字a: " number1 read -p "请输入操作符…...
【专题】计算机网络之运输层(传输层)
1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用: 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运…...
【leetcode100】旋转图像
1、题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],…...
软件工程——期末复习(1)
名词解释: 名词解释--人月 答案:人月是软件开发工作量的单位,1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败,并简单举例说明。 答案:缺陷(defect)指系统代…...
HTML5系列(3)--多媒体标签详解
前端技术探索系列:HTML5 多媒体标签详解 🎥 开篇寄语 👋 前端开发者们, 在前三篇文章中,我们探讨了 HTML5 的语义化和表单特性。今天,让我们深入了解 HTML5 的多媒体能力,看看如何构建强大的…...