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

Go小技巧易错点100例(十六)

本期看点:

正文开始:

切片的长度和容量

在Go语言中,切片(slice)是一个引用类型,它是对底层数组的抽象表示,提供了动态长度的、灵活的序列类型。切片包含三个重要的属性:指向底层数组的指针、切片的长度以及切片的容量。

  1. 长度(Length) :切片的长度是指切片中当前包含的元素个数。它可以通过内置的len()函数来获取。例如,对于切片s,其长度可以通过len(s)得到。
  2. 容量(Capacity) :切片的容量是指从切片的第一个元素开始,到底层数组中最后一个元素之间的元素个数。换句话说,容量表示在不重新分配底层数组的情况下,切片可以容纳的元素的最大数量。容量可以通过内置的cap()函数来获取。对于切片s,其容量可以通过cap(s)得到。

切片的长度和容量之间有一个重要的关系:切片的长度不会超过其容量。 这意味着,当你尝试向切片添加更多元素时,如果添加后的元素个数超过了切片的容量,Go语言会创建一个新的、更大的底层数组,并将原有元素和新元素复制到新数组中,然后让切片指向这个新的底层数组。这个过程称为切片的扩容。

需要注意的是,切片的长度和容量是可以变化的。当你使用append()函数向切片添加元素时,如果添加后的元素个数没有超过容量,那么切片的长度会增加,但容量保持不变。如果超过了容量,则会发生扩容,切片的长度和容量都会增加。

一个简单的例子:

func SliceLenAndCap1() {list := make([]int, 0)fmt.Printf("list elements = %+v , len = %d , cap = %d \n", list, len(list), cap(list))newList := append(list, 1, 2, 3)fmt.Printf("list elements = %+v , len = %d , cap = %d \n", newList, len(newList), cap(newList))newList2 := append(newList, 4)fmt.Printf("list elements = %+v , len = %d , cap = %d \n", newList2, len(newList2), cap(newList2))// 输出://list elements = [] , len = 0 , cap = 0//list elements = [1 2 3] , len = 3 , cap = 3//list elements = [1 2 3 4] , len = 4 , cap = 6
}func SliceLenAndCap2() {list := []int{1, 2, 3}fmt.Printf("list elements = %+v , len = %d , cap = %d \n", list, len(list), cap(list))newList := append(list, 4)fmt.Printf("list elements = %+v , len = %d , cap = %d \n", newList, len(newList), cap(newList))// 输出://list elements = [1 2 3] , len = 3 , cap = 3//list elements = [1 2 3 4] , len = 4 , cap = 6
}

在Go语言的源码(src/runtime/slice.go)中有growslice这样一个函数解释了切片的扩容原理,当原切片长度小于 1024 时,新的切片长度直接加上 append 元素的个数,容量则会直接 *2,当原切片长度大于等于 1024 时,新的切片长度直接加上 append 元素的个数,容量则会增加 1/4,所以在日常开发中,如果能明确知道切片的长度或者容量时,我们需要在初始化的时候声明,避免切片频繁扩容而带来的花销。

for循环中使用defer

在Go语言中,defer语句用于在函数返回前执行一些清理操作,无论函数是正常返回还是发生了panic。当你在for循环中使用defer时,有几个关键点需要注意:

  1. 延迟执行defer语句中的函数会在包含它的函数返回前被调用,而不是在defer语句被执行时立即调用。这意味着,如果你在for循环中使用了defer,循环体内的代码会先执行完毕,然后才会执行defer中的函数。
  2. 后进先出(LIFO) :多个defer语句在函数中的执行顺序是后进先出。也就是说,最后一个defer语句中的函数会第一个被调用,依此类推。
  3. 参数值:当defer语句被遇到时,会记录其函数和参数,但参数的值是在defer实际执行时才被计算的。这意味着如果defer语句中的函数参数依赖于循环变量,那么这些参数将使用循环结束时的值。

下面是一个例子来演示这些概念:

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {defer fmt.Println(i)}
}

在上面的代码中,defer fmt.Println(i)语句会在每次循环迭代时都被记录,但fmt.Println(i)函数本身并不会立即执行。当main函数返回时,这些defer语句会按照后进先出的顺序执行。因为循环变量i在每次迭代时都被更新,所以最终所有的defer语句都会打印出循环结束时的值,即4

如果你希望每个defer打印出它自己被创建时的循环变量值,你可以通过将循环变量作为参数传递给一个匿名函数来捕获其当前值:

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {defer func(x int) {fmt.Println(x)}(i)}
}

在这个修改后的例子中,我们创建了一个匿名函数,它接受一个参数x,并立即使用循环变量i的值来调用它。这样做可以确保每个defer语句捕获并记住它自己的i值,并在稍后打印出来。输出将会是:

4
3
2
1
0

这展示了defer语句在for循环中是如何按照后进先出的顺序执行的,并且说明了如何捕获循环变量的当前值以便在defer语句执行时使用。

Go语言TrimLeft函数

在Go语言的strings包中,TrimLeft函数用于删除字符串左侧的指定字符集合。它接受两个参数:一个是要处理的字符串,另一个是要删除的字符集合。

下面是strings.TrimLeft的基本用法:

package mainimport ("fmt""strings"
)func main() {str := "   Hello, World!   "// 去除字符串左侧的空格trimmed := strings.TrimLeft(str, " ")fmt.Println(trimmed) // 输出: "Hello, World!   "// 去除字符串左侧的多个特定字符strWithPrefix := "!!!Hello, World!!!"trimmedWithPrefix := strings.TrimLeft(strWithPrefix, "!")fmt.Println(trimmedWithPrefix) // 输出: "Hello, World!!!"// 去除字符串左侧的字符集合中的任意字符strWithChars := "abcHello, World!abc"trimmedWithChars := strings.TrimLeft(strWithChars, "abc")fmt.Println(trimmedWithChars) // 输出: "Hello, World!abc"
}

在上面的例子中,我们首先使用strings.TrimLeft来删除字符串左侧的空格。然后,我们删除了一个字符串左侧的多个感叹号字符。最后,我们删除了一个字符串左侧的任何abc字符。

需要注意的是,strings.TrimLeft只删除字符串左侧的字符,而不会对字符串的右侧进行任何操作。如果你想要同时删除字符串两侧的字符,可以使用strings.TrimSpace(仅删除空格)或strings.Trim(删除两侧的指定字符集合)。

另外,如果你想要删除字符串左侧满足某个条件的字符(例如,删除所有数字),你可以使用正则表达式配合regexp包来实现,但strings.TrimLeft本身只支持删除指定的字符集合。

相关文章:

Go小技巧易错点100例(十六)

本期看点&#xff1a; 正文开始&#xff1a; 切片的长度和容量 在Go语言中&#xff0c;切片&#xff08;slice&#xff09;是一个引用类型&#xff0c;它是对底层数组的抽象表示&#xff0c;提供了动态长度的、灵活的序列类型。切片包含三个重要的属性&#xff1a;指向底层数…...

通过Golang实现中间人攻击,查看和修改https流量包

要查看和修改 HTTPS 流量包&#xff0c;需要使用一个能够执行 中间人攻击&#xff08;Man-in-the-Middle, MITM&#xff09; 的代理工具。这个工具将拦截并解密 HTTPS 流量&#xff0c;然后允许查看和修改流量包的内容&#xff0c;再将其重新加密并发送到目标服务器。 完整的 …...

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统&#xff0c;为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL&#xff0c;以及如何进行基本的配置&#xff0c;以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …...

android13布局查看工具 无源码查看布局 在线查找ui布局id

总纲 android13 rom 开发总纲说明 目录 1.前言 2.工具介绍 2.1工具1 2.2工具2 2.3工具3 2.4工具4 3.彩蛋 1.前言 Android 13提供了一些工具来帮助开发人员查看和优化应用的布局。方便的让我们找到具体应用的布局文件等信息。 2.工具介绍 2.1工具1 老版本DDMS&#x…...

【自动化测试必学语言】python:UnitTest框架

目录 介绍 框架 什么是UnitTest框架&#xff1f; 为什么使用UnitTest框架? UnitTest核心要素&#xff08;unitest 的组成部分&#xff09; 1.TestCase&#xff08;最核心的模块&#xff09; 2.TestSuite 3.TestRunner 4.TestLoader 5.Fixture TestCase&#xff08…...

大话LLM之向量数据库

向量数据库是一种专门设计的存储系统&#xff0c;旨在高效处理和查询高维向量数据&#xff0c;通常用于人工智能和机器学习应用中&#xff0c;以实现快速准确的数据检索。 好的&#xff0c;今天我们就来聊聊人工智能和向量数据库的事儿。现在人工智能发展得特别快&#xff0c;特…...

EmguCV学习笔记 C# 2.2 Matrix类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…...

[Windows CMD] 查看网络连接状态 netstat -na | findstr “TCP“

在 Windows 系统中&#xff0c;我们可以使用 netstat 命令来查看网络连接状态&#xff0c;并使用 findstr 命令来过滤出 TCP 和 UDP 的连接。 查看所有网络连接的状态 netstat -na netstat -na: 显示所有网络连接的状态&#xff0c;-n 表示显示数字地址而非域名&#xff0c;…...

「OC」视图控制器的懒加载策略

「OC」视图控制器的懒加载策略 文章目录 「OC」视图控制器的懒加载策略懒加载懒加载的优点常见的懒加载实现方法使用懒加载的注意事项 控制器的懒加载参考资料 懒加载 懒加载&#xff08;Lazy Loading&#xff09;是一种设计模式&#xff0c;其核心思想是在需要时才进行对象的…...

android studio 中 .gitignore 文件改动后 忽略的文件夹或文件无效

问题原因&#xff1a;已跟踪文件的缓存问题&#xff1a; 如果之前已经跟踪了这些文件&#xff08;即它们已经被 Git 加入到版本控制中&#xff09;&#xff0c;即使你在 .gitignore 文件中添加了忽略规则&#xff0c;Git 仍然会显示这些文件。你需要先从 Git 中移除这些文件&am…...

鸿蒙 next 实现摄像头视频预览编码(一)

鸿蒙 next 即将发布&#xff0c;让我们先喊3遍 遥遥领先~ 遥遥领先~ 遥遥领先~ 作为一门新的系统&#xff0c;本人也是刚入门学习中&#xff0c;如果对于一些理解有问题的&#xff0c;欢迎即使指出哈 首先这里要讲一下&#xff0c;在鸿蒙 next 中&#xff0c;要实现摄像头预览…...

YOLO-V3

一、概述 最大的改进就是网络结构&#xff0c;使其更适合小目标检测特征做的更细致&#xff0c;融入多持续特征图信息来预测不同规格物体先验框更丰富了&#xff0c;3种scale&#xff0c;每种3个规格&#xff0c;一共9种softmax改进&#xff0c;预测多标签任务 先验框&#xf…...

golang提案,内置 Go 错误检查函数

先来狠狠吐个槽 要吐槽 Go1 的 error &#xff0c;那咱得先整明白大家为啥都猛喷它的错误处理做得不咋地。在 Go 语言里头&#xff0c;error 本质上其实就是个 Error 的接口&#xff1a; type error interface {Error() string }实际的应用场景如下&#xff1a; func main()…...

零售业务产品系统应用架构设计(三)

智慧物业依据《住房和城乡建设部等部门关于推动物业服务企业加快发展线上线下生活服务的意见建房〔2020〕99号》,推动物业管理公司广泛运用5G、互联网、物联网、云计算、大数据、区块链和人工智能等技术,建设智慧物业管理服务平台,对接城市信息模型(CIM)和城市运行管理服务…...

【GD32】从零开始学GD32单片机 | PMU电源管理单元+深度睡眠和待机例程(GD32F470ZGT6)

1. 简介 PMU电源管理单元通俗讲就是用来管理MCU的电源域的&#xff0c;它主要有两个功能——电压监测和低功耗管理。在GD32中一共有3个电源域——VDD/VDDA域、1.2V域和备份域。 VDD/VDDA域主要供PMU控制器、ADC、DAC等外设使用&#xff1b;1.2V域就是大部分外设都会使用的电源域…...

公司员工电脑桌面太乱如何解决?桌面管理软件一招解决!

“工欲善其事&#xff0c;必先利其器。” 在数字化管理的时代背景下&#xff0c;选择合适的桌面管理软件就如同为企业网络管理装上了一双慧眼。 员工的电脑桌面往往因为长时间的使用而变得杂乱无章&#xff0c;这不仅影响了工作效率&#xff0c;还可能给企业信息安全带来隐患。…...

leetcode:2119. 反转两次的数字(python3解法)

难度&#xff1a;简单 反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得到 reversed1 &#xff0c;接着反转 reversed1 得到 reversed2 。如果 reverse…...

5.vue中axios封装工程化

vue工程化中axios封装 视频演示地址&#xff1a;https://www.bilibili.com/video/BV121egeQEHg/?vd_source0f4eae2845bd3b24b877e4586ffda69a 通常我们封装需要封装request.js基础的发送请求工具类&#xff0c;再根据业务封装service类&#xff0c;service类是具体业务的接口…...

实验六:动态数码管实验

实验结果图,从右到左0-7,从左到右7-0,来回滚动。 硬件接线图: 具体看图,不说了,前面讲过,自己查资料就可以,资料得慢慢查,熟练就好了,不浪费时间和版面了 main.c代码 #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;#define SMG P0 …...

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 05网络虚拟化

本章帮助网络工程师或架构师回答如下问题&#xff1a; 什么是网络虚拟化?网络虚拟化有哪些用途?网络虚拟化领域内有哪些不同的技术方向?网络虚拟化的控制面有哪些选择?当使用 VXLAN 时如何进行桥接和路由&#xff1f; 什么是网络虚拟化&#xff1f; 网络虚拟化可以让网络…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...