Go 函数的三种用法:方法、闭包、实参

Golang
385
0
0
2022-08-11
标签   Golang基础

先看一段代码

package app

import (
    "github.com/gin-gonic/gin" 
    "github.com/EDDYCJY/go-gin-example/pkg/e"
)

type Gin struct {
    C *gin.Context
}

func (g *Gin) Response(httpCode, errCode int, data interface{}) {
    g.C.JSON(httpCode, gin.H{
        "code": errCode,
        "msg":  e.GetMsg(errCode),
        "data": data,
    })

    return
}

我发出疑问 正常的函数 不是 func 方法名 返回值,多出的(g *Gin)是啥呢?

查阅资料 问网友后发现 这是一种函数用法:Go 语言中同时有函数和方法

Go 语言中同时有函数和方法

概述:一个方法就是一个包含了接受的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

具体模式为

func (variable_name variable_data_type) function_name()  [return_type]{ 
    /* 函数体*/  
}

实例

package main

import (
   "fmt"  
)

/* 定义结构体 */
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圆的面积 = ", c1.getArea())
}

//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性 
  return 3.14 * c.radius * c.radius
}

执行代码

圆的面积 =  314

看到这里 所以g.C.JSON()可以调用 因为

  • *Gin 传递给 g
  • *Gin 里有C
  • C 里还有*gin.Context
  • *gin.Context 有JSON() 方法

除此之外 go 函数还有两种用法 闭包和方法

闭包

概念:Go 语言支持匿名函数,可作为闭包。匿名函数是一个”内联”语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。

具体例子

package main

import "fmt"

//函数 getSequence() 返回匿名函数 func() int
func getSequence() func() int {
   i:=0 
   return func() int {
      i+=1 
     return i  
   }
}

func main(){
   /*nextNumber 为一个函数,函数 i 为 0 */
   nextNumber := getSequence()  

   /* 调用 nextNumber 函数,i 变量自增 1 并返回 */
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())

   /* 创建新的函数 nextNumber1,并查看结果 */
   nextNumber1 := getSequence()  
   fmt.Println(nextNumber1())
   fmt.Println(nextNumber1())
}

执行结果 依次输出:1 2 3 1 2

函数作为实参

这个比较简单,直接代码

package main

import (
   "fmt" 
   "math"
)

func main(){
   /* 声明函数变量 */
   getSquareRoot := func(x float64) float64 {
      return math.Sqrt(x)
   }

   /* 使用函数 */
   fmt.Println(getSquareRoot(9))// getSquareRoot(9) 成了Println的实参

}

直接输出 3