首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
函数参数与返回值
传递变长参数
defer 和追踪
内置函数
递归函数
将函数作为参数
闭包
应用闭包:将函数作为返回值
使用闭包调试
计算函数执行时间
通过内存缓存来提升性能
声明和初始化
切片
For-range 结构
切片重组(reslice)
切片的复制与追加
字符串、数组和切片的应用
声明、初始化和 make
测试键值对是否存在及删除元素
for-range 的配套用法
map 类型的切片
map 的排序
将 map 的键值对调
标准库概述
regexp 包
锁和 sync 包
精密计算和 big 包
自定义包和可见性
为自定义包使用 godoc
使用 go install 安装自定义包
自定义包的目录结构、go install 和 go test
通过 Git 打包和安装
Go 的外部包和项目
在 Go 程序中使用外部库
结构体定义
使用工厂方法创建结构体实例
使用自定义包中的结构体
带标签的结构体
匿名字段和内嵌结构体
方法
类型的 String() 方法和格式化描述符
垃圾回收和 SetFinalizer
当前位置:
首页>>
技术小册>>
go编程权威指南(二)
小册名称:go编程权威指南(二)
如果函数的最后一个参数是采用 `...type` 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。 ```go func myFunc(a, b, arg ...int) {} ``` 这个函数接受一个类似于切片 (slice) 的参数(详见[第 7 章](07.0.md)),该参数可以通过[第 5.4.4 节](05.4.md) 中提到的 `for` 循环结构迭代。 示例函数和调用: ```go func Greeting(prefix string, who ...string) Greeting("hello:", "Joe", "Anna", "Eileen") ``` 在 `Greeting()` 函数中,变量 `who` 的值为 `[]string{"Joe", "Anna", "Eileen"}`。 如果参数被存储在一个 slice 类型的变量 `slice` 中,则可以通过 `slice...` 的形式来传递参数,调用变参函数。 示例 6.7 [varnumpar.go](examples/chapter_6/varnumpar.go) ```go package main import "fmt" func main() { x := min(1, 3, 2, 0) fmt.Printf("The minimum is: %d\n", x) slice := []int{7,9,3,5,1} x = min(slice...) fmt.Printf("The minimum in the slice is: %d", x) } func min(s ...int) int { if len(s)==0 { return 0 } min := s[0] for _, v := range s { if v < min { min = v } } return min } ``` 输出: The minimum is: 0 The minimum in the slice is: 1 **练习 6.3** [varargs.go](exercises/chapter_6/varargs.go) 写一个函数,该函数接受一个变长参数并对每个元素进行换行打印。 一个接受变长参数的函数可以将这个参数作为其它函数的参数进行传递: ```go func F1(s ...string) { F2(s...) F3(s) } func F2(s ...string) { } func F3(s []string) { } ``` 变长参数可以作为对应类型的 slice 进行二次传递。 但是如果变长参数的类型并不是都相同的呢?使用 5 个参数来进行传递并不是很明智的选择,有 2 种方案可以解决这个问题: 1. 使用结构(详见[第 10 章](10.0.md)): 定义一个结构类型,假设它叫 `Options`,用以存储所有可能的参数: ```go type Options struct { par1 type1, par2 type2, ... } ``` 函数 `F1()` 可以使用正常的参数 `a` 和 `b`,以及一个没有任何初始化的 `Options` 结构: `F1(a, b, Options {})`。如果需要对选项进行初始化,则可以使用 `F1(a, b, Options {par1:val1, par2:val2})`。 2. 使用空接口: 如果一个变长参数的类型没有被指定,则可以使用默认的空接口 `interface{}`,这样就可以接受任何类型的参数(详见[第 11.9 节](11.9.md) )。该方案不仅可以用于长度未知的参数,还可以用于任何不确定类型的参数。一般而言我们会使用一个 for-range 循环以及 `switch` 结构对每个参数的类型进行判断: ```go func typecheck(..,..,values … interface{}) { for _, value := range values { switch v := value.(type) { case int: … case float: … case string: … case bool: … default: … } } } ``` x
上一篇:
函数参数与返回值
下一篇:
defer 和追踪
该分类下的相关小册推荐:
WebRTC音视频开发实战
GO面试指南
go编程权威指南(四)
Go进阶之分布式爬虫实战
Go Web编程(下)
go编程权威指南(三)
深入浅出Go语言核心编程(八)
深入浅出Go语言核心编程(二)
从零写一个基于go语言的Web框架
深入浅出Go语言核心编程(五)
Go Web编程(中)
深入浅出Go语言核心编程(四)