Golang 函数 不定参数

news2024/11/27 17:41:23

不定参数


在C语言时代大家一般都用过printf()函数,从那个时候开始其实已经在感受不定参数的魅力和价值。如同C语言中的printf()函数,Go语言标准库中的fmt.Println()等函数的实现也严重依赖于语言的不定参数功能。

我们将介绍不定参数的用法。合适地使用不定参数,可以让代码简单易用,尤其是输入输出类函数,比如日志函数等。

 


不定参数类型


不定参数是指函数传入的参数个数为不定数量。为了做到这点,首先需要将函数定义为接受不定参数类型:

func myfunc(args ...int){
   for_, arg := range args {
     fmt.Println(arg)
  }
}

这段代码的意思是,函数myfunc()接受不定数量的参数,这些参数的类型全部是int,所以它可以用如下方式调用:

myfunc(2,3,4)
myfunc(1,3,7,13)

形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。它是一个语法糖(syntactic sugar),即这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说,使用语法糖能够增加程序的可读性,从而减少程序出错的机会。

从内部实现机理上来说,类型...type本质上是一个数组切片,也就是[ ]type,这也是为什么上面的参数args可以用for循环来获得每个传入的参数。

假如没有...type这样的语法糖,开发者将不得不这么写:

func myfunc2(args []int){
  for _, arg := range args {
     fmt.Println(arg)
  }
}

从函数的实现角度来看,这没有任何影响,该怎么写就怎么写。但从调用方来说,情形则完全不同:

myfunc2([]int{1,3,7,13})

你会发现,我们不得不加上[]int{}来构造一个数组切片实例。但是有了...type这个语法糖,我们就不用自己来处理了。


不定参数的传递


假设有另一个变参函数叫做myfunc3(args...int),下面的例子演示了如何向其传递变参:

func myfunc(args ...int){
  
  //按原样传递myfunc3(args...)
  //传递片段,实际上任意的int slice都可以传进去myfunc3(args[1:]...)
}

 

任意类型的不定参数


之前的例子中将不定参数类型约束为int,如果你希望传任意类型,可以指定类型为interface{}。下面是Go语言标准库中fmt.Printf()的函数原型:

func Printf(format string, args ...interface{})
{//  ...}

用interface{}传递任意类型数据是Go语言的惯例用法。使用interface{}仍然是类型安全的,这和C/C++不太一样。关于它的用法,代码示范了如何分派传入interface{}类型的数据。

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

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

相关文章

✔★ 算法基础笔记(Acwing)(五)—— 动态规划【java版本】

动态规划 一、背包问题★f[i][j] 背包容量为j,前i个物品的最大价值 1. 01背包问题(不需要初始化) ✔1.6 ✔1.72. ☆ 完全背包问题(后面的 前面的某一项的最大值)一、朴素做法(三重循环)二、二维数组的优化&#xff08…

OpenCV 实现 SIFT→SURF 算法关键点检测实现

1,SIFT算法原理 1.1,基本流程 1.1.1 尺度空间极值检测 1.1.2 关键点定位 1.1.3 关键点方向确定 、 1.1.4 关键点描述 1.1.5 总结 1.2 SURF原理 2 代码实现 import cv2 as cv import matplotlib.pyplot as plt import numpy as np from pylab i…

open ai chartgpt 安装插件 txyz.ai

1 chatgpt 页面 左下角 用户 -> setting 2 3

RK3568驱动指南|第五期-中断-第44章 共享工作队列实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

2023年深圳等保测评机构名称以及地址汇总

你知道深圳等保测评机构有哪些?知道在哪里吗?今天我们小编就给大家汇总一下。 2023年深圳等保测评机构名称以及地址汇总 序号:1 名称:深圳市信息安全管理中心 地址:深圳市福田区莲花街道福中路城市数字资源中心 序…

CMake 官方完整版

CMake 官方完整版 一些概念TargetSignature 1. A Basic Starting Point(Step 1)Adding a Version Number and Configured Header FileSpecify the C StandardBuild and Test 2. Adding a Library(Step 2)-添加一个库Adding an Option 3. Adding Usage Requirements for Library…

【Verilog 教程】4.8Verilog 过程连续赋值

关键词:deassign,force,release 过程连续赋值是过程赋值的一种。这种赋值语句能够替换其他所有 wire 或 reg 的赋值,改写了 wire 或 reg 型变量的当前值。 与过程赋值不同的是,过程连续赋值的表达式能被连续的驱动到 …

pinyin-match选择器拼音快速检索目标

npm地址:https://www.npmjs.com/package/pinyin-match 选择器拼音快速检索目标(pinyin-match) 一. 使用方法二. 使用实例三. 实现效果 一. 使用方法 安装 pinyin-match 包 yarn add pinyin-match 或 npm install pinyin-match --save 引入 …

3分钟,免费制作一个炫酷实用的数据可视化大屏!

在当前大数据时代背景下,数据已成为在工业革命中如同煤炭、石油一般宝贵的资源。但是由于数据越来越庞大、越来越复杂,导致数据的可读性也越来越低。因此,对数据可视化的需求也越来越高,需要解决的问题也越来越复杂,而…

测试工程师高效编写API测试

1、自动化测试流程 我一直有编写自动化测试的习惯,但之前一直没有达到最理想的效果,也在反思问题出现的原因,最近终于有了一些思路。其主要的原因是之前写测试都是靠感觉,感觉哪些需要测试了,就写一个测试&#xff0c…

【面试必刷TOP101】二分查找-I 二维数组中的查找

目录 题目:二分查找-I_牛客题霸_牛客网 (nowcoder.com) 题目的接口: 解题思路: 代码: 过啦!!! 题目:二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1…

emacs怎么安装插件

2023年9月26日,周二下午 目录 Linux下Emacs的配置文件位置包管理器elpa怎么给elpa换源罗列可按照的插件怎么搜索插件怎么安装插件配置插件 Linux下Emacs的配置文件位置 默认配置文件位置是 ~/.emacs 或 ~/.emacs.d/init.el 如果没有inti.el的话,自己创…

产品经理如何进行项目管理?

在网上总是有人认为产品经理和项目经理不是一路人,工作上也没有什么共性,认为项目管理仅仅是项目经理的活,其实不然。一个项目从初始到结束这一整个周期,产品经理都是需要全程盯着的。 那么优秀的产品经理是怎么管理项目的呢&…

7、如何使用Flink中的窗口(Window算子)

目录 1、如何理解 Flink中的窗口(window) 2、Flink中窗口的类型 2.1 根据上游DataStream类型分类 2.2 根据驱动类型分类 2.3 根据进入到窗口数据的分发规则分类 3、怎样使用 Flink中的 Window算子 4、怎样使用 Flink中的 Window Assigners 4.1、…

Python 进阶 - 日常工作中使用过的简单Trick

引言:无论你是一名初学者还是有一定经验的开发者,这些技巧都能帮助你更好地利用Python来解决问题、提高效率和写出更干净、可维护的代码。无论你是数据科学家、Web开发者、自动化脚本编写者还是其他领域的从业者,这些技巧都能对你有所帮助。 …

Linux 日期、时区

1、date命令 通过date命令可以在命令行中查看系统的时间 date [-d] [格式化字符串] -d 按照给定的字符串显示日期,一般用于日期计算 格式化字符串:通过特定的字符串标记,来控制显示的日期格式 %Y 年 %y 年份后两位数字 (00..99) %m …

【百度地图】绘制扇形图层

思路:使用多边形图层PolygonLayer,借助函数将一个经纬度转换成扇形经纬度数组 扇形经纬度数组生成函数 /** 返回扇形经纬度数组 绘制多边形* lon 经度* lat 维度* radius 半径* azimuth 方向角* jiaodu(扇形的夹角)** **/ export…

java Spring Boot2.7写一个接口 提供图片预览 前端可以直接用接口地址当src为图片地址使用

我们特别是在做小程序开发时 很多图片会比较大 而小程序本身就对自身大小要求非常高 所以 图片放在服务器上提供访问链接是一种非常好的选择 我想很多前端会误认为 直接将图片放在服务器上就可以了 但其实没那么简单 因为服务器其实也可以理解为一个电脑 你就想 你自己本地都不…

python+requests+pytest+allure自动化框架

1.核心库 requests request请求 openpyxl excel文件操作 loggin 日志 smtplib 发送邮件 configparser unittest.mock mock服务 2.目录结构 base utils testDatas conf testCases testReport logs 其他 2.1base base_path.py 存放绝对路径,dos命令或Jenkins执行…