Go 函式的三種用法:方法、閉包、實參

zhaocrazy發表於2021-12-27

先看一段程式碼

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 協議》,轉載必須註明作者和本文連結
滴水穿石,石破天驚----馬乂

相關文章