Go说话可变参数范例简朴易懂
在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. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |