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

    文章

    1868

    浏览量

    33765
  • 编码
    +关注

    关注

    6

    文章

    1016

    浏览量

    56668

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FPG推出CheckMax,以AI洞察助力餐饮业利润最大化

    -FPG推出CheckMax,Frontline Performance Group推出CheckMax,以AI洞察助力餐饮业利润最大化 更高利润、更优服务:CheckMax直击餐厅头号经营挑战
    的头像 发表于 12-10 19:02 829次阅读
    FPG推出CheckMax,以AI洞察助力餐饮业利润<b class='flag-5'>最大化</b>

    聚飞光电PLM系统升级推动IPD全流程价值最大化落地

    研发全流程的规范化管控与高效协同,为产品创新提速、市场响应提质注入核心动力,推动IPD全流程价值最大化落地。
    的头像 发表于 12-05 09:55 444次阅读
    聚飞光电PLM系统升级推动IPD全流程价值<b class='flag-5'>最大化</b>落地

    提升PLC数据采集效率:性能瓶颈分析与实践

    面对“越快越好”的PLC数据采集需求,如何准确评估设备能力瓶颈?又该如何突破极限,实现采集速度的最大化?本文将系统探讨如何科学评估PLC的数据采集能力极限,并在此基础上,提供一系列旨在最大化采集速度
    的头像 发表于 11-26 11:33 96次阅读
    提升PLC数据采集效率:性能瓶颈分析与实践

    数据驱动的 “不给糖就捣蛋”,让你的万圣节收获最大化

    一年只有一次! 鉴于尽可能多收集糖果的时间窗口十分有限,我们希望为孩子们提供一个竞争优势 —— 当然,这要借助 Minitab预测分析模块的力量。为了直观展示这一点,我们模拟了一个场景:通过收集 “不给糖就捣蛋者”(即参与活
    的头像 发表于 10-27 15:14 213次阅读
    <b class='flag-5'>用</b>数据驱动的 “不给糖就捣蛋”,让你的万圣节收获<b class='flag-5'>最大化</b>

    天合光能解决方案如何助力光伏发电收益最大化

    近日,由天合光能携手全球权威光伏媒体PV Magazine举办的光伏技术研讨会于线上举行。围绕“电力市场化时代光伏资产价值最大化”这一主题,天合光能产品经理李子轩同观众分享了最新的产品技术与市场趋势
    的头像 发表于 10-22 11:36 963次阅读
    天合光能解决方案如何助力光伏发电收益<b class='flag-5'>最大化</b>

    IP6163至为芯具备MPPT硬件算法的太阳光伏降压DC-DC芯片

    英集芯IP6163是一款主要应用于太阳电池板供电的光伏降压DC-DC芯片。 具备最大功率点追踪功能(MPPT),快速精准定位太阳电池板的最大
    的头像 发表于 09-19 17:50 737次阅读
    IP6163至为芯具备MPPT硬件算法的太阳<b class='flag-5'>能</b>光伏降压DC-DC芯片

    普源示波器DS80000在太阳逆变器测试中的应用

    :将光伏阵列输出的直流电(DC)转换为交流电(AC),满足负载或并网需求。 最大功率点跟踪(MPPT):动态调整工作点,确保在不同光照、温度条件下最大化输出功率。 电网同步:并网时与电网电压、频率、相位精准匹配,避免电能质量问题和安全隐患。
    的头像 发表于 07-31 17:26 621次阅读
    普源示波器DS80000在太阳<b class='flag-5'>能</b>逆变器测试中的应用

    【VisionFive 2单板计算机试用体验】3、开源大语言模型部署

    , Gemma等开源大模型。当然,一些闭源的(类似chatgpt, gemini)是不支持部署的。如下图: 在端侧部署大模型,个人认为最大的好处:是可以避免因文本或图片上传而造成的信息泄露,因为一切文本
    发表于 07-19 15:45

    光伏电站能源管理系统的技术应用

    光伏电站的能源管理是指通过一系列技术手段和管理策略,对光伏电站的发电、储、用电及并网过程进行全面监测、控制和优化,以提高能源利用效率、确保电网稳定运行、降低运维成本,并最大化电站的经济效益和环境
    的头像 发表于 06-16 11:37 554次阅读

    一个带有CYPD3177的自定义COOLDIM_PRG_BOARD,当翻转时,则没有POWER_DRILL2GO,为什么?

    我有一个带有 CYPD3177 的自定义COOLDIM_PRG_BOARD 。 当插入时,仅从POWER_DRILL2GO电源接收POWER_DRILL2GO信号,并且 USB 电缆处于一个方向
    发表于 05-26 07:24

    光伏用户必看!阳台储电表:余电存储再利用,发电收益最大化

    系统,属于超小型分布式光伏系统,也被称为插入式光伏系统。用户只需将光伏系统固定在阳台栏杆上,将系统电缆插入家中插座,利用太阳发电产生电力供应。阳台光伏是指安装在阳台上的一种小型光伏系统,通常由一到两个光伏组件、一个‌微型逆变器和一个储
    的头像 发表于 05-23 10:53 1043次阅读
    光伏用户必看!阳台储<b class='flag-5'>能</b>电表:余电存储再利用,发电收益<b class='flag-5'>最大化</b>

    借助DFT技术实现竞争力最大化

    通过改进和优化设计与制造的各个方面,半导体行业已经能够实现 IC 能力的巨大进步。可测试性设计 (DFT)——涵盖从在 RTL 中插入测试逻辑,到对现场退回产品进行失效分析等全流程,是半导体企业获得商业成功的关键环节。如果没有有效的 DFT 策略,公司将难以满足市场对 DFT 集成、缺陷检测以及制造工艺/良率改进的巨大需求。
    的头像 发表于 05-22 15:16 757次阅读

    从 Java 到 Go:面向对象的巨人与云原生的轻骑兵

    Go 语言在 2009 年被 Google 推出,在创建之初便明确提出了“少即是多(Less is more)”的设计原则,强调“以工程效率为核心,极简规则解决复杂问题”。它与 Java
    的头像 发表于 04-25 11:13 516次阅读

    EE-19:最大化DSP-21xx系列DSP(不包括ADSP-218x)的引导内存效率

    电子发烧友网站提供《EE-19:最大化DSP-21xx系列DSP(不包括ADSP-218x)的引导内存效率.pdf》资料免费下载
    发表于 01-14 16:09 0次下载
    EE-19:<b class='flag-5'>最大化</b>DSP-21xx系列DSP(不包括ADSP-218x)的引导内存效率

    EE-365:在ADSP-CM40x混合信号控制处理器上实现ADC采样速率最大化

    电子发烧友网站提供《EE-365:在ADSP-CM40x混合信号控制处理器上实现ADC采样速率最大化.pdf》资料免费下载
    发表于 01-13 16:52 0次下载
    EE-365:在ADSP-CM40x混合信号控制处理器上实现ADC采样速率<b class='flag-5'>最大化</b>