大家好,我叫谢伟,是一名程序员。
本专栏的主旨是梳理 Golang 知识,力求从入门到中级程序员水平。
学习的过程中,希望不断把好的编程思维和思路引入到代码中,提高代码的美感、可靠性。
和写文章一样,写代码也需要遵循一定的规则,添加一定的修饰等,提升文章的美感,丰富作品。
如果你对我感兴趣,可以在添加个人微信号,或者 Github 上找到我。
这节的主题是: 函数
包括下面几点:任何语言几乎都是这些规则,但是各语言又规定不同的语法。
- 函数的定义
- 参数:定参,不定参数
- 返回值:单个返回值,多个返回值, 命名返回值
- 值传递和指针传递
- 函数作为参数
- 匿名函数
- main 和 init 函数
1. 函数的定义
- 关键字
func
// declare
func example() {
fmt.Println("Hello world")
}
// main
func main() {
example()
}
2. 函数参数:单个参数,不定参数
// arg
func exampleOneArg(arg int) {
fmt.Println(arg + 1)
}
// arg list
func exampleListArg(args ...int) {
for index, value := range args {
fmt.Println(index, value)
}
}
// main
func main() {
exampleOneArg(12)
exampleListArg(1, 2, 3, 4, 5)
}
3. 返回值:单个返回值、多个返回值、命名返回值
// one response
func exampleOneResponse(arg int) int {
return arg*100 + 1
}
// two responses
func exampleTwoResponses(arg int) (int, int) {
return arg * 10, arg * 100
}
// name response
func exampleNameResponse(arg int) (sum int) {
sum = arg * 1000
return
}
// main
func main() {
exampleOneResponse(10)
exampleTwoResponses(10)
exampleNameResponse(10)
}
4. 值传递和指针传递
值传递和指针传递针对的是函数的传入参数究竟是拷贝入参的值进行操作还是拷贝入参的内存地址,带来的效果就是一个能改变传入的参数的值,一个不能改变传入参数的值。
// copy value
func exampleValueCopy(arg int) int {
arg = arg + 1
return arg
}
// copy address
func exampleValueAddress(arg *int) int {
*arg = *arg + 1
return *arg
}
// main
func main() {
var arg int = 10
exampleValueCopy(arg)
fmt.Println(arg) // 10
exampleValueAddress(&arg)
fmt.Println(arg) // 11
}
5. 函数作为参数
// func as arg
func funcArg(arg int) int {
return arg * 100
}
func exampleFuncAsArg(arg int, function func(int) int) int {
return arg + function(arg)
}
// main
func main() {
fmt.Println(exampleFuncAsArg(10, funcArg)) // 1010
}
6. 匿名函数
// un name func
var NoNameFunc = func(arg int) int { return arg * 1000 }
// main
func main() {
fmt.Println(NoNameFunc(10)) // 10000
}
7. main 和init 函数
- 这两个函数没有入参和返回值
- 一个工程有且只有一个 main 函数作为程序的主入口
- 一个工程可以有多个init 函数,执行顺序和包的导入顺序相关
网友评论