第六章修改 (#843)

Co-authored-by: Joe Chen <jc@unknwon.io>
This commit is contained in:
Haigang Zhou
2022-05-09 22:19:53 +08:00
committed by GitHub
parent f5dae8f559
commit c42d8a340a
13 changed files with 101 additions and 99 deletions

View File

@@ -6,7 +6,7 @@
func myFunc(a, b, arg ...int) {}
```
这个函数接受一个类似某个类型的 slice 的参数(详见第 7 章),该参数可以通过第 5.4.4 节中提到的 for 循环结构迭代。
这个函数接受一个类似于切片 (slice) 的参数(详见[第 7 章](07.0.md)),该参数可以通过[第 5.4.4 节](05.4.md) 中提到的 `for` 循环结构迭代。
示例函数和调用:
@@ -15,7 +15,7 @@ func Greeting(prefix string, who ...string)
Greeting("hello:", "Joe", "Anna", "Eileen")
```
在 Greeting 函数中,变量 `who` 的值为 `[]string{"Joe", "Anna", "Eileen"}`
`Greeting()` 函数中,变量 `who` 的值为 `[]string{"Joe", "Anna", "Eileen"}`
如果参数被存储在一个 slice 类型的变量 `slice` 中,则可以通过 `slice...` 的形式来传递参数,调用变参函数。
@@ -53,7 +53,7 @@ func min(s ...int) int {
The minimum is: 0
The minimum in the slice is: 1
**练习 6.3** varargs.go
**练习 6.3** [varargs.go](exercises\chapter_6\varargs.go)
写一个函数,该函数接受一个变长参数并对每个元素进行换行打印。
@@ -73,7 +73,7 @@ func F3(s []string) { }
但是如果变长参数的类型并不是都相同的呢?使用 5 个参数来进行传递并不是很明智的选择,有 2 种方案可以解决这个问题:
1. 使用结构(详见第 10 章):
1. 使用结构(详见[第 10 章](10.0.md)
定义一个结构类型,假设它叫 `Options`,用以存储所有可能的参数:
@@ -85,11 +85,11 @@ func F3(s []string) { }
}
```
函数 F1 可以使用正常的参数 a 和 b,以及一个没有任何初始化的 Options 结构: `F1(a, b, Options {})`。如果需要对选项进行初始化,则可以使用 `F1(a, b, Options {par1:val1, par2:val2})`。
函数 `F1()` 可以使用正常的参数 `a` 和 `b`,以及一个没有任何初始化的 `Options` 结构: `F1(a, b, Options {})`。如果需要对选项进行初始化,则可以使用 `F1(a, b, Options {par1:val1, par2:val2})`。
2. 使用空接口:
如果一个变长参数的类型没有被指定,则可以使用默认的空接口 `interface{}`,这样就可以接受任何类型的参数(详见第 11.9 节)。该方案不仅可以用于长度未知的参数,还可以用于任何不确定类型的参数。一般而言我们会使用一个 for-range 循环以及 switch 结构对每个参数的类型进行判断:
如果一个变长参数的类型没有被指定,则可以使用默认的空接口 `interface{}`,这样就可以接受任何类型的参数(详见[第 11.9 节](11.9.md) )。该方案不仅可以用于长度未知的参数,还可以用于任何不确定类型的参数。一般而言我们会使用一个 for-range 循环以及 `switch` 结构对每个参数的类型进行判断:
```go
func typecheck(..,..,values … interface{}) {