加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Go说话可变参数范例简朴易懂

发布时间:2021-05-27 21:55:35 所属栏目:编程 来源:互联网
导读:在C说话期间各人一样平常都用过 printf() 函数,从谁人时辰开始着实已经在感觉可变参数的魅力和代价,犹如C说话中的 printf() 函数,Go说话尺度库中的 fmt.Println()
在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这个语法糖,我们就不消本身来处理赏罚了。 恣意范例的可变参数 之前的例子中将可变参数范例束缚为 int,假如你但愿传恣意范例,可以指定范例为 interface{},下面是Go说话尺度库中 fmt.Printf() 的函数原型:

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

用 interface{} 转达恣意范例数据是Go说话的老例用法,行使 interface{} 如故是范例安详的,这和 C/C++ 不太一样,下面通过示例来相识一下怎样分派传入 interface{} 范例的数据。

package main

import "fmt"

func MyPrintf(args ...interface{}) {

for _, arg := range args {

switch arg.(type) {

case int:

fmt.Println(arg, "is an int value.")

case string:

fmt.Println(arg, "is a string value.")

case int64:

fmt.Println(arg, "is an int64 value.")

default:

fmt.Println(arg, "is an unknown type.")

}

}

}

func main() {

var v1 int = 1

var v2 int64 = 234

var v3 string = "hello"

var v4 float32 = 1.234

MyPrintf(v1, v2, v3, v4)

}

该措施的输出功效为:

1 is an int value. 234 is an int64 value. hello is a string value. 1.234 is an unknown type.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读