Go语言开发小技巧易错点100例(十一)

往期回顾:

  • Go语言开发小技巧&易错点100例(一)
  • Go语言开发小技巧&易错点100例(二)
  • Go语言开发小技巧&易错点100例(三)
  • Go语言开发小技巧&易错点100例(四)
  • Go语言开发小技巧&易错点100例(五)
  • Go语言开发小技巧&易错点100例(六)
  • Go语言开发小技巧&易错点100例(七)
  • Go语言开发小技巧&易错点100例(八)
  • Go语言开发小技巧&易错点100例(九)
  • Go语言开发小技巧&易错点100例(十)

本期看点(技巧类用【技】表示,易错点用【易】表示)

  • Go函数式编程【技】
  • 不建议map使用指针类型作为Key【易】
  • 直接使用值为nil的slice和map【易】

正文开始:

Go函数式编程

函数式编程是一种编程范式。函数式编程语言最重要的基础是λ演算,λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。与指令式编程相比,函数式编程强调函数的计算比指令的执行重要。与过程化编程相比,函数式编程里函数的计算可随时调用。

此外,在函数式编程中,函数是一等公民,这意味着它们可以绑定到名称(包括本地标识符),作为参数传递,并从其他函数返回,就像任何其他数据类型一样。这允许以声明性和可组合的风格编写程序,其中小功能以模块化方式组合。

我们来展示一下Go语言的函数式编程(大家可以猜想一下这段代码的运行结果):

func PlayFunc(str string, fn func() error) error {fmt.Println(str)defer func() {fmt.Println("defer 1 ...")}()defer func() {fmt.Println("defer 2 ...")}()return fn()
}func main() {err := PlayFunc("string ...", func() error {fmt.Println("func ...")return nil})fmt.Println(err)
}

答案:

string ...
func ...
defer 2 ...
defer 1 ...
<nil>
不建议map使用指针类型作为Key

在Go语言中,指针类型不能作为map的键(key)的主要原因是因为指针的值是动态的,并且可能会发生变化。当使用指针作为map的键时,如果两个指针指向同一个内存地址,它们被认为是相等的,但是如果指针所指向的值发生变化,那么这两个指针就不再相等了。

举个例子:

type Student struct {Id   stringName string
}func TestMapPointKey(t *testing.T) {m := make(map[*Student]struct{})m[&Student{Id: "1", Name: "zs"}] = struct{}{}_, ok := m[&Student{Id: "1", Name: "zs"}]fmt.Println(ok) // false
}

为了解决这个问题,Go语言规定map的键必须是不可变(immutable)的类型,例如基本类型(如整数、字符串等),或者具有只读属性的复合类型(如数组、结构体等)。这些类型的值在创建后就不能被修改,因此它们可以作为map的键使用。

比如这样:

func TestMap(t *testing.T) {m := make(map[Student]struct{})m[Student{Id: "1", Name: "zs"}] = struct{}{}_, ok := m[*&Student{Id: "1", Name: "zs"}]fmt.Println(ok) // true
}

基本数据类型下的指针类型也会存在这个问题:

func TestMapInt(t *testing.T) {m := make(map[*int]struct{})p := 1m[&p] = struct{}{}p1 := 1_, ok := m[&p1]fmt.Println(ok) // false m2 := make(map[int]struct{})p2 := 1m2[p2] = struct{}{}p3 := 1_, ok = m2[p3]fmt.Println(ok) // true
}

总结起来,Go语言中指针类型不能作为map的键是因为指针的值是动态的,可能会发生变化,而map的键需要是不可变的类型。

直接使用值为nil的slice和map
func TestEmptyMap(t *testing.T) {var m map[string]struct{}m["name"] = struct{}{}
}

这段代码是一个Go语言的测试函数,但是它有一个错误。声明了一个名为m的map,该map的键是字符串类型,而值是空结构体类型(struct{})。由于m是一个空的map(即它还没有任何键值对),因此不能直接赋值。这将导致运行时错误。为了修复这个错误,需要首先为map m分配一个值(比如 m = make(map[string]struct{})),然后再尝试插入键值对。

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

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

相关文章

优雅处理并发:Java CompletableFuture最佳实践

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天&#xff0c;小黑要和大家聊聊CompletableFuture&#xff0c;这个Java 8引入的强大工具。 在Java传统的Future模式里&#xff0c;咱们都知道&#xff0c;一旦开始了一个异步操作&#xff0c;就只能等它结束…

26.9K Star,漫画阅读 APP 开源了

今天推荐是一款适用于 Android 6.0 及更高版本的免费开源漫画阅读器&#xff0c;基于 Kotlin 开发的。这款 APP 完全免费、好用、无广告&#xff0c;自带上千个全球漫画源&#xff0c;在线阅读和下载都很方便&#xff0c;是漫画爱好者必备&#xff01; 它以插件的形式提供了来自…

wsl2下运行docker

安装docker服务 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun无法启动问题 这个错误提示通常是因为系统中使用的是经过修改的 nftables&#xff0c;而 Docker 安装程序使用 iptables 进行 NAT。为了解决这个问题&#xff0c;您可以使用以下命令将系统…

【我想开发一个小程序,大概需要多少钱?】

小程序开发为什么报价差距很大&#xff1f;主要是因为小程序的实现方法和功能模型不同。 小程序的实现方法&#xff1a; 实现方法主要分为SAAS小程序、定制小程序和第三方平台小程序。不同的实现方法价格都是不一样的&#xff0c;大概的区间如下&#xff1a; SAAS小程序和第三…

Zapier/Make.com/数环通/集简云的对比

Zapier/Make.com/数环通/集简云 这四家公司都是为了自动化&#xff0c;这也是流行大趋势。我不想错过未来的大趋势&#xff0c;花了2周时间分别用四家公司的模块实现了相同的任务。 为什么会用2周时间&#xff1f;我第一次接触无代码自动化。最重要的目的是为了白嫖&#xff0…

云卷云舒:数据库2023年度盘点

一、年度总结词 云、卷 二、年度大事记 1 月 10 日&#xff0c;KaiwuDB&#xff08;原&#xff1a;开务数据库&#xff09; 发布了 KaiwuDB 1.0 时序数据库&#xff0c;其运用到实时就地运算等核心专利技术&#xff0c;专为工业物联网、数字能源、交通车联网、智慧产业等场景…

office办公技能|word中的常见通配符使用

一、删除Word中含有指定内容的整行 操作方法&#xff1a; 1、快捷键 CtrlH&#xff0c;打开Word的查找替换窗口&#xff0c;单击【更多】按钮&#xff0c;勾选“使用通配符”。 2、在查找内容处&#xff0c;输入“替换内容*^13”&#xff0c;替换为处什么都不填。 3、单击【…

13. 抽象类(abstract关键字)

抽象类 抽象类1. 抽象类1.1 定义格式1.2 特点 2. 抽象方法2.1 定义格式2.2 特点 3. abstract关键字 抽象类 抽象类是在面向对象编程中&#xff0c;一种特殊的类&#xff0c;它不能被实例化&#xff0c;只能作为其他类的基类来使用。 抽象类和普通类的主要区别在于它包含一个或…

Harbor离线安装

下载安装包 $ wget https://github.com/goharbor/harbor/releases/download/v2.7.4/harbor-offline-installer-v2.7.4.tgz解压 $ tar xvf harbor-offline-installer-v2.7.4.tgz -C /usr/local修改配置 $ cd /usr/local/harbor $ cp harbor.yml.tmpl harbor.yml $ vim harbo…

sqlserver导出数据为excel再导入到另一个数据库

要将SQL Server中的数据导出为Excel文件&#xff0c;然后再将该Excel文件导入到另一个数据库中&#xff0c;你可以按照以下步骤进行操作&#xff1a; 导出数据为Excel文件 echo offset SourceServer源服务器名称 set SourceDB数据库名称 set ExcelFilePath导出到的Excel文件路…

二叉树的遍历(递归法)

递归的三要素&#xff1a; ①确定递归函数的参数和返回值 ②确定终止条件 ③确定单层递归的逻辑 以前序遍历为例&#xff1a; 1、确定递归函数的参数和返回值&#xff1a; 参数中需要传入list来存放节点的数值&#xff0c;除了这一点就不需要再处理什么数据了也不需要有返…

【文献解读】“MOBILEViT:轻量级、通用目的、移动友好的视觉变换器”。

今天阅读这篇2022年ICLR会议上发表的论文&#xff0c;主要是为了学习MobileViT模型&#xff0c;用于YOLO模型主干改造。 一、文献概述 作者&#xff1a;Sachin Mehta 和 Mohammad Rastegari。地点&#xff1a;作者所属机构是 Apple。内容简述&#xff1a; 提出了一种名为Mob…

手把手Docker部署Gitblit服务器

1拉取镜像 docker pull jacekkow/gitblit:v1.9.1 2.启动 docker run -d --name gitblit --restart always -p 10006:8080 -p 18443:8443 -p 19418:9418 -p 29418:29418 -v /data/gitblit/data:/opt/gitblit-data jacekkow/gitblit:v1.9.1 3.查看 默认账户/密码:admin/adm…

我的技术栈

.NET、.NET Core、C#11、Entity Framework、ASP.NET MVC、Linq、Lambda、Dapper、 Web Service、WCF、Web API、SOAP、HTTP、XML、JSON、RESTful、Protocol Buffers、 U3D、IOC、AOP、 SOAPRPCHTTPXML TCP/IP和UDP Web服务器&#xff1a;Nginx、IIS、Tomcat、Apache、 开发框架…

安卓手机变iOS!

Launcher iOS 16 - 安卓手机秒变iOS Launcher iOS 16 是一款iOS启动器&#xff0c;可以将安卓手机桌面变成iOS样子&#xff0c;还有iOS的开机动画和景深效果&#xff01; 下载链接&#xff1a;【Launcher iOS 16】 ​

腾讯云优惠券介绍、种类、领取入口及使用教程

腾讯云作为国内领先的云服务提供商&#xff0c;为广大的企业和开发者提供了优质的云计算、大数据、人工智能等服务。为了更好地吸引用户&#xff0c;腾讯云推出了多种优惠活动&#xff0c;其中就包括腾讯云优惠券。本文将详细介绍腾讯云的优惠券种类、领取入口以及使用教程。 一…

第 4 章 链表

文章目录 4.1 链表(Linked List)介绍4.2 单链表的应用实例4.3 单链表面试题(新浪、百度、腾讯)4.4 双向链表应用实例4.4.1 双向链表的操作分析和实现4.4.2 课堂作业和思路提示 4.5 单向环形链表应用场景4.6 单向环形链表介绍4.7 Josephu 问题4.8 Josephu 问题的代码实现 4.1 链…

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 内存管理基本了解

大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作&#xff01; 移步飞书获得更好阅读体验&#xff1a; Docs Hello&#xff0c;大家好我是硬核王同学&#xff0c;是一名刚刚工作一年…

ubuntu22.04 virt-manager bridge虚拟机ip 一样

virt-manager bridge 全部虚拟机ip都一样解决办法 ubuntu22.04 virt-manager 创建 ubuntu20.04 live-server 虚拟机&#xff0c;创建好后&#xff0c;使用bridge网络&#xff0c;正常运行。 clone虚拟机启动后&#xff0c;发现虚拟机的ip都一样&#xff0c;重启无效。 解决办…

习题5-1 代码对齐(Alignment of Code, ACM/ICPC NEERC 2010, UVa1593)

输入若干行代码&#xff0c;要求各列单词的左边界对齐且尽量靠左。单词之间至少要空一格。每个单词不超过80个字符&#xff0c;每行不超过180个字符&#xff0c;一共最多1000行&#xff0c;样例输入与输出如图所示。 //代码对齐 //思路&#xff1a;统计每列最长的单词 不够长…