1.形参和实参
之前学Python时,比较少接触这两个概念,所以做下备忘
// 形参就是方法定义的参数,如下面的变量a;实参就是实际传进的参数,比如下面的变量b
func test(a string){
fmt.Println(a)
}
b := "aa"
test(b)
2.Go的参数和返回值
2.1 Go的参数类型在参数名后面,返回值在参数后面
// x,y是传递的参数,最终返回int类型
func add(x int, y int) int {
return x + y
}
2.2 类型共享
// x, y类型一致,只需要声明一个类型即可
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return x, y
}
2.3 一个return关键字返回所有值,这种方式Go文档称为Named return values,不建议在比较复杂的函数内使用
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return // 如下,这里的return关键字等同于return x, y
}
3.可变参数
Golang的可变参数使用...符号实现
3.1 同一类型的不定参数
// 不定参数,numbers等同于一个切片
func indefiniteParams(numbers ...int) {
fmt.Println(reflect.TypeOf(numbers)) // []int
for _, num := range numbers {
fmt.Println(num)
}
}
func indefiniteParamsTest() {
indefiniteParams(1, 2, 3)
}
3.2 不同类型的不定参数
func diffTypeParams(args ...interface{}) {
for _, arg := range args { //迭代不定参数
switch arg.(type) {
case int:
fmt.Println(arg, "is int")
case string:
fmt.Println(arg, "is string")
case float64:
fmt.Println(arg, "is float64")
case bool:
fmt.Println(arg, "is bool")
default:
fmt.Println("未知类型")
}
}
}
func diffTypeParamsTest() {
diffTypeParams(11, 11.1, "22", false)
}
4.结构体方法
结构体方法,也可以简单理解为类方法
详细请戳: Go指南7-面对对象与结构体
5.闭包的实现
func getSequence() func() int {
i := 0
fmt.Println("i", i)
return func() int {
i += 1
return i
}
}
func getSequenceTest() {
// 初始化, 返回函数,此时 nextNumber 等价于 func() int { i += 1; return i }
nextNumber := getSequence()
// 由于nextNumber本质是一个函数,nextNumber()即执行该函数,只不过i的值会保留,所以i的值会一直累加
fmt.Println(nextNumber()) // 1
fmt.Println(nextNumber()) // 2
fmt.Println(nextNumber()) // 3
}