函数

函数是语句序列的集合,能够将一个大的工作分解为小的任务,对外隐藏了实现细节

  • 函数组成
    • 函数名
    • 参数列表(parameter-list)
    • 返回值(result-list)
    • 函数体(body)
  1. func name(parameter-list) (result-list){
  2. body
  3. }
  • 单返回值函数
  1. func plus(a, b int) (res int){
  2. return a + b
  3. }
  • 多返回值函数
  1. func multi()(string, int){
  2. return "name", 18
  3. }
  • 命名返回值
  1. // 被命名的返回参数的值为该类型的默认零值
  2. // 该例子中 name 默认初始化为空字符串,height 默认初始化为 0
  3. func namedReturnValue()(name string, height int){
  4. name = "xiaoming"
  5. height = 180
  6. return
  7. }
  • 参数可变函数
  1. func sum(nums ...int)int{
  2. fmt.Println("len of nums is : ", len(nums))
  3. res := 0
  4. for _, v := range nums{
  5. res += v
  6. }
  7. return res
  8. }
  9. func main(){
  10. fmt.Println(sum(1))
  11. fmt.Println(sum(1,2))
  12. fmt.Println(sum(1,2,3))
  13. }
  • 匿名函数
  1. func main(){
  2. func(name string){
  3. fmt.Println(name)
  4. }("禾木课堂")
  5. }
  • 闭包
  1. func main() {
  2. addOne := addInt(1)
  3. fmt.Println(addOne())
  4. fmt.Println(addOne())
  5. fmt.Println(addOne())
  6. addTwo := addInt(2)
  7. fmt.Println(addTwo())
  8. fmt.Println(addTwo())
  9. fmt.Println(addTwo())
  10. }
  11. func addInt(n int) func() int {
  12. i := 0
  13. return func() int {
  14. i += n
  15. return i
  16. }
  17. }
  • 函数作为参数
  1. func sayHello(name string) {
  2. fmt.Println("Hello ", name)
  3. }
  4. func logger(f func(string), name string) {
  5. fmt.Println("start calling method sayHello")
  6. f(name)
  7. fmt.Println("end calling method sayHellog")
  8. }
  9. func main() {
  10. logger(sayHello, "禾木课堂")
  11. }
  • 传值和传引用
  1. func sendValue(name string) {
  2. name = "hemuketang"
  3. }
  4. func sendAddress(name *string) {
  5. *name = "hemuketang"
  6. }
  7. func main() {
  8. // 传值和传引用
  9. str := "禾木课堂"
  10. fmt.Println("before calling sendValue, str : ", str)
  11. sendValue(str)
  12. fmt.Println("after calling sendValue, str : ", str)
  13. fmt.Println("before calling sendAddress, str : ", str)
  14. sendAddress(&str)
  15. fmt.Println("after calling sendAddress, str: ", str)
  16. }