先看一段程式碼
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 協議》,轉載必須註明作者和本文連結