Go 函数的三种用法:方法、闭包、实参 
                                                    
                        
                    
                    
  
                    
                    先看一段代码
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
本文参考 菜鸟教程
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           zhaocrazy 的个人博客
 zhaocrazy 的个人博客
         
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: