当前位置: 首页 > 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; 网络虚拟化可以让网络…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...