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

    文章

    1870

    浏览量

    34026
  • 编码
    +关注

    关注

    6

    文章

    1040

    浏览量

    57125

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    江苏省镇江市分布光伏接入电网容量发布,安科瑞助力投资主体效益最大化

    实现绿电效益最大化。安科瑞产品咨询:15000363176 江苏镇江分布式光伏接入电网开放容量明细: 一、精准监测与实时预警:为并网运行装上“千里眼” 可开放容量公告中高达36.13%的配变倒送电比例,折射出分布式光伏项目普遍面临“自
    的头像 发表于 04-10 14:46 568次阅读
    江苏省镇江市分布光伏接入电网容量发布,安科瑞助力投资主体效益<b class='flag-5'>最大化</b>

    士兰微电子推出新一代组串储电站模块解决方案

    士兰微电子推出新一代组串储电站模块解决方案,采用目前行业领先的SL_FS5 IGBT及SL_G4 SiC芯片技术,结合ANPC两快四慢拓扑设计,最大化转化效率。
    的头像 发表于 04-08 17:35 1129次阅读
    士兰微电子推出新一代组串储<b class='flag-5'>能</b>电站模块解决方案

    27.62%效率的混合BC硅电池:载流子提取最大化策略

    混合背接触(BC)硅太阳电池融合了TOPCon结构的电子选择性接触、硅异质结(SHJ)结构的空穴选择性接触,以及交叉指式背接触(IBC)的器件布局。尽管已有研究实现了27.8%的效率,但该架构相较
    的头像 发表于 03-23 09:04 431次阅读
    27.62%效率的混合BC硅电池:载流子提取<b class='flag-5'>最大化</b>策略

    微电网经济调度理论:成本最小化与效益最大化的优化模型

    与效益最大化的具体量化指标;约束条件是模型的运行底线,确保调度方案的可行性与安全性;优化变量是模型的调控对象,决定了调度方案的实施路径。
    的头像 发表于 03-12 11:05 208次阅读
    微电网经济调度理论:成本最小化与效益<b class='flag-5'>最大化</b>的优化模型

    告别逆流罚款!西格电力防逆流方案,让光伏并网零风险、收益最大化

    合规性的管控愈发严格,违规逆流不仅面临经济处罚,还可能影响项目并网资格。西格电力防逆流柔性控制方案,精准对标政策要求,从源头破解痛点,实现光伏并网零合规风险、发电收益最大化的双重目标。
    的头像 发表于 01-27 16:23 1927次阅读
    告别逆流罚款!西格电力防逆流方案,让光伏并网零风险、收益<b class='flag-5'>最大化</b>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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