0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go语言可变参数怎么用能最大化它的效用

马哥Linux运维 来源:博客园 作者:apocelipes 2021-09-30 16:33 次阅读

Go 语言可变参数怎么用能最大化它的效用?本文对可变参数进行了详细介绍。

在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的 fmt.Printf 和 fmt.Println:

fmt.Printf(“一共有%v 行%v 列、n”, rows, cols)

fmt.Println(“共计大小:”, size)

当你需要实现类似的接口时,就需要我们的可变参数出场了。

golang 的可变参数

可变参数就是一个占位符,你可以将 1 个或者多个参数赋值给这个占位符,这样不管实际参数的数量是多少,都能交给可变参数来处理,我们看一下可变参数的声明:

func Printf(format string, a ...interface{}) (n int, err error)func Println(a ...interface{}) (n int, err error)

可变参数使用 name ...Type 的形式声明在函数的参数列表中,而且需要是参数列表的最后一个参数,这点与其他语言类似;

可变参数在函数中将转换为对应的 []Type 类型,所以我们可以像使用 slice 时一样来获取传给函数的参数们;

有一点值得注意,golang 的可变参数不需要强制绑定参数的出现。

举个例子,我想在 c 语言中实现一个求和任意个整数的函数 sum:

int sum(int num, ...) {

// todo

}

我们只有先指定至少一个固定的形参(num)才能使用...可变参数,在 golang 中是不需要这样做的:

func sum(nums ...int) int {

//todo

}

这也是 golang 语法简洁的其中一个体现。

传递参数给...可变参数

传递参数给带有可变参数的函数有两种形式,第一种与通常的参数传递没有什么区别,拿上一节的 sum 举个例子:

sum(1, 2, 3)

sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

除了参数的个数是动态变化的之外和普通的函数调用是一致的。

第二种形式是使用...运算符以变量...的形式进行参数传递,这里的变量必须是与可变参数类型相同的 slice,而不能是其他类型(没错,数组也不可以),看个例子:

numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

sum(numbers.。.) // 和 sum(1, 2, 3, 4, 5, 6, 7, 8, 9. 10) 等价

这种形式最常用的地方是在内置函数 append 里:

result := []int{1, 3}

data := []int{5, 7, 9}

result = append(result, data.。.) // result == []int{1, 3, 5, 7, 9}

是不是和 python 的解包操作很像,没错,大部分情况下你可以把...运算符当做是 golang 的 unpack 操作,不过有几点不同还是要注意的:

第一,只能对 slice 类型使用...运算符:

arr := [...]int{1, 2, 3, 4, 5}

sum(arr.。.) // 编译无法通过

你会见到这样的报错信息cannot use arr (type [5]int) as type []int in argument to sum

这是因为可变参数实际是个 slice,... 运算符是个语法糖,它把前面的 slice 直接复制给可变参数,而不是先解包成独立的 n 个参数再传递,这也是为什么我只说...运算符看起来像 unpack 的原因。

第二个需要注意的地方是不能把独立传参和 ... 运算符混用,再看个例子:

slice := []int{2, 3, 4, 5}

sum(1, slice.。.) // 无法通过编译

这次你会见到一个比较长的报错:

too many arguments in call to sum

have (number, []int.。.)

want (...int)

这是和前面所说的原因是一样的,... 运算符将不定参数直接替换成了 slice,这样就导致前一个独立给出的参数不再算入可变参数的范围内,使得函数的参数列表从 (...int) 变成了 (int, ...int),最终使得函数类型不匹配编译失败。

正确的做法也很简单,不要混合使用...运算符给可变参数传参即可。

读了这篇文章,再加上一些简单的联系,我相信你们一定也能掌握 golang 可变参数的使用。

参考:

https://golang.org/ref/spec#Passing_arguments_to_.。._parameters

https://golang.org/doc/effective_go.html#append

转自:

cnblogs.com/apocelipes/p/9861315.html

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 参数
    +关注

    关注

    11

    文章

    1764

    浏览量

    32056
  • 编码
    +关注

    关注

    6

    文章

    933

    浏览量

    54739

原文标题:Go 可变参数 ... parameters 读这篇就够了

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在学习go语言的过程踩过的坑

    作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上也先后开发了两个go项目。在学习go
    的头像 发表于 11-11 09:22 62次阅读

    go语言如何解决并发问题

    作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比
    的头像 发表于 10-23 13:38 100次阅读
    <b class='flag-5'>go</b><b class='flag-5'>语言</b>如何解决并发问题

    扩展坞使用技巧:如何最大化你的笔记本电脑接口能力

    最大化您的笔记本电脑接口能力,以下是一些实用的扩展坞使用技巧: 了解您的需求:在购买扩展坞之前,明确您需要哪些类型的端口(如HDMI, USB-C, RJ45等)以及是否需要充电功能,以选择最适合
    的头像 发表于 10-08 10:52 271次阅读

    如何更好地发挥工业冷水机的最大效用

    在工业制造领域中,工业冷水机作为关键的温度控制设备,对于确保工业生产线的稳定运行、提高产品质量及延长生产设备的寿命起着至关重要的作用。更好地发挥工业冷水机的最大效用,帮助企业和工厂更好地使用工
    的头像 发表于 09-12 14:52 155次阅读
    如何更好地发挥工业冷水机的<b class='flag-5'>最大</b><b class='flag-5'>效用</b>

    液冷充电枪线最大化提高充电效率

    法法易提供的液冷充电枪线可以最大化的提升充电效率,让大家的充电时间进一步缩短。  液冷充电枪线使用液体循环来冷却电缆,以避免因高温而导致电缆损坏或充电速度减缓。而且液冷充电枪线采用铜芯导线和耐高温、耐磨损、
    的头像 发表于 09-11 14:25 295次阅读

    智慧城市管理系统:引领未来城市发展的创新力量

    智慧城市管理系统是现代城市发展的关键,通过整合资源、优化决策和提升效率,实现了城市资源的最大化利用和效益最大化通过大数据分析和智能算法,深度挖掘城市运行中的各种数据,精准预测和解
    的头像 发表于 08-21 11:35 208次阅读
    智慧城市管理系统:引领未来城市发展的创新力量

    三十分钟入门基础Go Java小子版

    前言 Go语言定义 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态、强类型、编译型语言
    的头像 发表于 08-12 14:32 661次阅读
    三十分钟入门基础<b class='flag-5'>Go</b> Java小子版

    Go语言中的函数、方法与接口详解

    Go 没有类,不过可以为结构体类型定义方法。方法就是一类带特殊的接收者参数的函数。方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。(非结构体类型也可以定义方法)
    的头像 发表于 04-23 16:21 726次阅读

    fpga的是什么编程语言 fpga什么语言开发

    和VHDL都是用于逻辑设计的硬件描述语言,并且都已成为IEEE标准。它们形式化地抽象表示电路的结构和行为,支持逻辑设计中层次与领域的描述,具有电路仿真与验证机制以保证设计的正确性,并便于文档管理和设计重用。 fpga什么
    的头像 发表于 03-14 17:09 3265次阅读

    C语言中的可变参数介绍

    C 语言为这种情况提供了一个解决方案,允许您定义一个函数,根据具体的需求接受可变数量的参数
    发表于 02-28 14:00 271次阅读
    C<b class='flag-5'>语言</b>中的<b class='flag-5'>可变</b><b class='flag-5'>参数</b>介绍

    GPT写个mexFunction

    最近有位用户想在 MATLAB 里 m 代码实现一个将某个图形窗口最大化显示的功能,问我们有没有 MATLAB 函数支持这个。
    的头像 发表于 01-25 10:10 657次阅读
    <b class='flag-5'>用</b>GPT写个mexFunction

    用于并行采样的EVADC同步转换,如何在最大化采样率的同时最大限度地减少抖动?

    在我的应用程序中,HSPDM 触发 EVADC 同时对两个通道进行采样。 我应该如何配置 EVADC 以最大限度地减少采样抖动并最大限度地提高采样率? 在用户手册中,提到 SSE=0,USC=0
    发表于 01-18 07:59

    使用go语言实现一个grpc拦截器

    在开发grpc服务时,我们经常会遇到一些通用的需求,比如:日志、链路追踪、鉴权等。这些需求可以通过grpc拦截器来实现。本文使用go语言来实现一个 grpc一元模式(Unary)拦截器,上报链路追踪信息。
    的头像 发表于 12-18 10:13 622次阅读
    使用<b class='flag-5'>go</b><b class='flag-5'>语言</b>实现一个grpc拦截器

    使用GaN HEMT设备最大化OBCs的功率密度

    随着电动汽车(EVs)的销售量增长,整车OBC(车载充电器)的性能要求日益提高。原始设备制造商正在寻求最小化这些组件的尺寸和重量以提高车辆续航里程。因此,我们将探讨如何设计、选择拓扑结构,以及如何通过GaN HEMT设备最大化OBCS的功率密度。
    的头像 发表于 12-17 11:30 986次阅读
    使用GaN HEMT设备<b class='flag-5'>最大化</b>OBCs的功率密度

    Go编程语言-你应该知道的一切

    Go 编程语言的故事始于 Google,当时三位工程师 Robert Griesemer、Rob Pike 和 Ken Thompson 对 C++ 的复杂性以及缺乏提供高效编译和执行的简单语言感到厌倦。
    的头像 发表于 12-11 17:37 599次阅读