一、函数参数
1.1 值传递、引用传递
知识点:
slice是值传递。
指针、map是引用传递。
代码1(默认值传递):
package main
import (
"fmt"
)
func test(a []int) {
a = append(a, 4)
}
func main() {
arr := []int{1,2,3}
fmt.Println(arr)
test(arr)
fmt.Println(arr)
}
运行结果1:
[root@bogon 10]# go run test.go
[1 2 3]
[1 2 3]
代码2(指针传递):
package main
import (
"fmt"
)
func test(a *[]int) {
*a = append(*a, 4)
}
func main() {
arr := []int{1,2,3}
fmt.Println(arr)
test(&arr)
fmt.Println(arr)
}
运行结果2:
[root@bogon 10]# go run test.go
[1 2 3]
[1 2 3 4]
1.2 可变参数
知识点:
num …int代表可变参数(可以传slice,s…)。
…interface{}代表任意类型。
代码1(可变参数示例):
package main
import (
"fmt"
)
func sum(nums ...int) int {
total := 0
for _, v := range nums {
total += v
}
return total
}
func main() {
fmt.Println(sum())
fmt.Println(sum(1, 2, 3))
s := []int{4, 5, 6}
fmt.Println(sum(s...))
}
运行结果1:
[root@bogon 10]# go run test.go
0
6
15
代码2(任意类型的可变参数):
package main
import (
"fmt"
)
func test(args ...interface{}) {
fmt.Println(args...)
}
func main() {
test(100, "ok", true)
}
运行结果2:
[root@bogon 10]# go run test.go
100 ok true
1.3 默认值
知识点:
golang不支持参数默认值,但可以通过一些方式实现类似功能。
二、返回值
2.1 多返回值
知识点:
bare return:如果一个函数所有的返回值都有显式的变量名,那么该函数的return语句可以省略操作数。这称之为bare return。
代码(bare return):
package main
import (
"fmt"
)
func test() (width, height int) {
width = 100
height = 200
return
}
func main() {
fmt.Println(test())
}
运行结果:
[root@bogon 10]# go run test.go
100 200
三、函数式编程
知识点
在go中,函数被当做第一类值:赋值给变量,作为参数,作为返回值。
匿名函数:func关键字后面没有函数名。
代码:
package main
import (
"fmt"
)
func test() (width, height int) {
width = 100
height = 200
return
}
func main() {
fmt.Println(test())
}
运行结果:
[root@bogon 10]# go run test.go
1
4
9
16