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