Go语言必知必会100问题-23 判断空切片最佳方法

前言

在Go语言必知必会100问题-22 空切片与nil切片有区别吗?中分析了空切片和nil切片是有区别的,那如何正确的判断一个切片是否为空切片呢?

案例引入

下面通过一个具体的例子进行说明,getOperations 函数返回一个float32类型的切片,在 handle 函数中会检查返回的切片中是否有元素,如果含有元素,调用 handle函数。

func handleOperations(id string) {operations := getOperations(id)if operations != nil {handle(operations)}
}func getOperations(id string) []float32 {operations := make([]float32, 0)if id == "" {return operations}// Add elements to operationsreturn operations
}

在函数 handleOperations 通过比较operations是否等于nil决定是否调用hanle函数。这样写存在问题,因为getOperations返回的切片永远不为nil, 即使返回的切片中不含任何元素,它也不为nil, 所以 operations != nil永远为true.

解决方法

如何处理呢? 有两种解决方法。

方法1

解决方法一:对getOperations函数进行修改,如果id为空,直接返回nil,而不是operations, 修改后的代码如下。这种修改方法有局限性,有时候我们是无法修改被调用方代码的,例如我们在调用第三方库的时候。

func getOperations(id string) []float32 {operations := make([]float32, 0)if id == "" {return nil}// Add elements to operationsreturn operations
}
方法2

通过切片的length是否为0来判断。无论是空切片还是nil切片,它们的长度都为0.

func handleOperations(id string) {operations := getOperations(id)if len(operations) != 0 {handle(operations)}
}
思考总结

综上,我们并不是总能够修改调用方逻辑,所以通过判断切片的长度是否为0判别切片中是否存在元素是最佳方法。与此同时,正如Go wiki中陈述的,在我们设计接口的时候,应该避免区分空切片和nil切片,对它们做区分会导致细微的程序错误。在返回切片时,如果返回nil切片或空切片,要确保不会产生语义上和技术上的差异,两者表达的应该是同一个意思。这项原则同样适用于map类型,通过检查map的长度为0判断是否为空,而不是通过nil来判断。

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

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

相关文章

Flutter第四弹:Flutter图形渲染性能

目标: 1)Flutter图形渲染性能能够媲美原生? 2)Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView,也不使用操作系统的原生控件,而是…

Java学习笔记14——常量与变量

曾和儿子分享过所谓计算机程序,都是编写代码进行“数据处理和处理数据”而已。任何编程语言编写何种应用,数据都必须以某种方式表示。掌握变量和常量的用法,可以使代码的可维护性、可读性大大提高。 一、常量 常量就是在程序中固定不变的量…

C语言scandir函数获取文件夹内容

scandir 函数用于列举指定目录下的文件列表,并将结果存储在一个动态分配的数组中。 函数原型: int scandir(const char *dirpath, struct dirent ***namelist,int (*filter)(const struct dirent *),int (*compar)(const struct dirent **, const stru…

labview中6种机械动作的区别

1.单击时转换:单击时转换,需要手动转换或者赋值回复原来状态; 2.释放时转换:释放时时转换,需要手动转换或者赋值回复原来状态; 3.单击时转换保持到鼠标释放:触发两次,自动恢复原来状…

Python互斥锁实例(包含超时解锁)

Python互斥锁实例(包含超时解锁) 文章目录 前言正文1 锁被占用直接返回2 拿不到锁则一直等待3 拿不到锁等待直到超时 总结 前言 最近遇到一个小需求,大概是请求机器人&自动化设备执行某些功能,这些功能之间有共同操作资源或在…

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…

多数问题求解之蒙特卡洛与分治法

多数问题(Majority Problem)是一个有多种求解方法的经典问题,其问题定义如下: 给定一个大小为 n n n的数组,找出其中出现次数超过 n / 2 n/2 n/2的元素 例如:当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] […

【WPS】压缩图片

第一步: 点击插入,点击图片 第二步: 点击图片工具,点击压缩图片 第三步:

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具(代码展示) 重新创建一个文件**/utils/someTools.js**,并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

jQuery模态框弹窗提示代码

jQuery模态框弹窗提示代码 下载地址 jQuery模态框弹窗提示代码

GPT每日面试题—Vue中style的scoped是如何实现样式隔离的

充分利用ChatGPT的优势,帮助我们快速准备前端面试。今日问题:Vue中style的scoped是如何实现样式隔离的。 Q:在前端面试中,如果被问到,vue文件中的scoped是如何实现样式格式的,什么回答比较好,全…

Requests教程-17-请求代理设置

上一小节我们学习了requests解决乱码的方法,本小节我们讲解一下requests设置代理的方法。 代理基本原理 代理实际上指的就是代理服务器, 英文叫作proxy server ,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户,我们通常会选择CICD工具来减少人力投入产生的成本,开源的工具比如有成熟的Jenkins,但是本文讲的是阿里云提高的解决方案云效平台,通过配置流水线的形式实现项目的快速部署到服务器…

【数据结构】双向链表及LRU缓存的实现

目录 前言 1. 在原有的自定义链表类 Linked 的基础上,添加新的 “节点添加”方法 addNode(Node node) 测试用例 测试结果 2. 在自定义链表类的基础上,使用双重循环“强力” 判断两个节点是否发生相交 测试用例 测试结果 3. 在自定义链表类的基础上…

突破编程_C++_面试(STL 编程 list)

面试题 1 :描述 std::list 的内部数据结构是什么,以及它如何影响性能? std::list 的内部数据结构是一个双向链表。这意味着它是由一系列节点组成的,每个节点都包含两部分:一部分是存储实际数据的数据域,另…

每日OJ题_哈希表⑤_力扣49. 字母异位词分组

目录 力扣49. 字母异位词分组 解析代码 力扣49. 字母异位词分组 49. 字母异位词分组 难度 中等 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入…

基于opencv的手势识别

当然可以,下面是一个使用OpenCV实现简单手势识别,并在摄像头捕捉的视频中描绘出手部轮廓为线条的示例。该代码会读取摄像头流,然后检测出手部,并用线条描绘出手的轮廓。 首先,你需要安装OpenCV库。如果你还没有安装&am…

Vulnhub靶机:Kioptrix_Level1.1

一、介绍 运行环境:Virtualbox 攻击机:kali(192.168.56.101) 靶机:Kioptrix_Level1.1(192.168.56.104) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vul…

C语言例2-3:从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数

回文数是将自然数n的各位数字反向排列得到自然数n1,若n1与n相等,则称为回文数,例如12321 //从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数 //回文数是将自然数n的各位数字反向排列得到自然数…

Mac管理Ruby环境

在 macOS 上切换 Ruby 环境主要涉及到使用不同的 Ruby 版本管理工具,比如 RVM(Ruby Version Manager)或 rbenv。下面分别介绍如何使用这两种工具在 Mac 上切换 Ruby 环境: 使用 RVM 切换 Ruby 环境 安装 RVM: 首先&am…