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

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

随着 Go 语言的不断迭代,新版本带来了许多实用的标准库函数,使得代码更加简洁、可读性更强。本篇文章主要介绍 Go 1.21+ 版本中的一些新特性,涵盖 可变类型比较、slice 最大值与最小值、map 转换为 slice 以及 map 合并 等常见场景,展示如何利用新特性优化代码。

本期分享:

1.可变类型比较

2.Slice 最大值与最小值

3.Map 转换为 Slice

4.Map 合并


可变类型比较

在 Go 语言中,比较两个数的大小通常使用 if 语句,但 Go 1.21 之后引入了新的内置函数,比如 max()min()

旧写法

oldFunc := func(a, b int) (int, int) {maxValue := aif a < b {maxValue = b}minValue := aif a > b {minValue = b}return maxValue, minValue
}

新写法

newFunc := func(i, j int) (int, int) {maxValue := max(i, j)minValue := min(i, j)return maxValue, minValue
}

注意点

如果我们看下源码:

func max[T cmp.Ordered](x T, y ...T) T

不难发现这个函数的参数貌似支持一个数字和一个数组一起进行比较,然后我们试一下:

newFunc := func(i int, l ...int) (int, int) {fmt.Println(max(i, l...)) // ...
}

就会发现编译的时候会报错:invalid use of ... with built-in max。这是为什么呢?

因为在Go语言中,... 是用于可变参数函数的语法糖。当你在函数调用中使用 ... 时,它会将一个切片展开为多个参数。然而,Go语言的内置函数 max 和 min 并不支持可变参数,因此你不能在调用这些函数时使用 ...

Slice 最大值与最小值

在旧版本中,需要手动遍历 slice 来求最大/最小值。而在 Go 1.21+ 中,slices.Maxslices.Min 让这件事变得更简单。

旧写法

oldFunc := func(s []int) (int, int) {maxValue := s[0]for i := 1; i < len(s); i++ {maxValue = max(maxValue, s[i])}minValue := s[0]for i := 1; i < len(s); i++ {minValue = min(minValue, s[i])}return maxValue, minValue
}

新写法

import "slices"newFunc := func(s []int) (int, int) {maxValue := slices.Max(s)minValue := slices.Min(s)return maxValue, minValue
}

Map 转换为 Slice

在开发过程中,我们经常需要将 map 的 key 或 value 提取为 slice。Go 1.21 之前,需要手动遍历 map,而新版本提供了 maps.Keysmaps.Values

旧写法

oldFunc := func(m map[string]string) ([]string, []string) {keys := make([]string, 0, len(m))for key := range m {keys = append(keys, key)}values := make([]string, 0, len(m))for _, value := range m {values = append(values, value)}return keys, values
}

新写法

import "maps"newFunc := func(m map[string]string) ([]string, []string) {keys := slices.Collect(maps.Keys(m))values := slices.Collect(maps.Values(m))return keys, values
}

Map 合并

Go 1.21 之前,map 合并需要手写循环,而新版本引入了 maps.Insert,让 map 合并变得更加简单。

旧写法

oldFunc := func(m1, m2 map[string]int) map[string]int {dst := map[string]int{"c": 3, "d": 4}for k, v := range m1 {dst[k] = v}return dst
}

新写法

newFunc := func(m1, m2 map[string]int) map[string]int {dst := map[string]int{"c": 3, "d": 4}maps.Insert(dst, maps.All(m1))return dst
}

本篇结束~

http://www.xdnf.cn/news/3978.html

相关文章:

  • rollout 是什么:机器学习(强化学习)领域
  • 【Vue】Vue3源码解析与实现原理
  • 关于 dex2oat 以及 vdex、cdex、dex 格式转换
  • VLA算法总结对比——RT1 / RT2 / Pi0 / Octo/ RDT / OpenVLA
  • 钩子函数和参数:Vue组件生命周期中的自定义逻辑
  • 2.3 向量组
  • Linux电源管理(6)_Generic PM之挂起功能
  • Ubuntu K8S(1.28.2) 节点/etc/kubernetes/manifests 不存在
  • n8n工作流自动化平台:生成图文并茂的分析报告之Merge节点详细说明
  • labelimg快捷键
  • DXFViewer进行中 : ->封装OpenGL -> 解析DXF直线
  • SpringMVC框架详解与实践指南
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)
  • 力扣119题解
  • 六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”
  • Java使用JDBC操作数据库
  • OpenCV进阶操作:图像直方图、直方图均衡化
  • 2.CFD 计算过程概述:Fluent在散热计算中的优势
  • 【Linux】linux入门——基本指令
  • Qt 信号槽机制底层原理学习
  • C++笔记之模板与可变参数模板
  • 动态链接库(DLL)
  • 网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)
  • LeetCode 热题 100 17. 电话号码的字母组合
  • 分布式事物
  • VTK 系统架构
  • 【NLP】33. Pinecone + OpenAI :构建自定义语义搜索系统
  • 五一作业-day04
  • 解决跨域的4种方法
  • CRS 16 slot 设备硬件架构