本文目錄一覽:
- 1、GoLang — Gin框架
- 2、golang 有處理jsonpath嗎
- 3、如何將Python的正則式轉換成Golang正則式
- 4、golang 正則 regexp包使用
- 5、golang正則表達式 分組命名
GoLang — Gin框架
• 何為框架:
框架一直是敏捷開發中的利器,能讓開發者很快的上手並做出應用,甚至有的時候,脫離了框架,一些開發者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構造應用,當這些方面都得心應手的時候,可以嘗試改造一些框架,或是自己創造一個。
Gin是一個golang的微框架,封裝比較優雅,API友好,源碼注釋比較明確,已經發布了1.0版本。具有快速靈活,容錯方便等特點。其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。
(1)首先需要安裝,安裝比較簡單,使用go get即可
go get github.com/gin-gonic/gin
如果安裝失敗,直接去Github clone下來,放置到對應的目錄即可。
(2)代碼中使用:
下面是一個使用Gin的簡單例子:
package main
import (
“github.com/gin-gonic/gin”
)
func main() {
router := gin.Default()
router.GET(“/ping”, func(c *gin.Context) {
c.JSON(200, gin.H{
“message”: “pong”,
})
})
router.Run(“:8080”) // listen and serve on 0.0.0.0:8080
}
簡單幾行代碼,就能實現一個web服務。使用gin的Default方法創建一個路由handler。然後通過HTTP方法綁定路由規則和路由函數。不同於net/http庫的路由函數,gin進行了封裝,把request和response都封裝到gin.Context的上下文環境。最後是啟動路由的Run方法監聽埠。麻雀雖小,五臟俱全。當然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。
Gin可以很方便的支持各種HTTP請求方法以及返回各種類型的數據,詳情可以前往查看。
2.1 匹配參數
我們可以使用Gin框架快速的匹配參數,如下代碼所示:
冒號:加上一個參數名組成路由參數。可以使用c.Param的方法讀取其值。當然這個值是字串string。諸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不會被匹配。
瀏覽器輸入以下測試:
返回結果為:
其中c.String是gin.Context下提供的方法,用來返回字元串。
其中c.Json是gin.Context下提供的方法,用來返回Json。
下面我們使用以下gin提供的Group函數,方便的為不同的API進行分類。
我們創建了一個gin的默認路由,並為其分配了一個組 v1,監聽hello請求並將其路由到視圖函數HelloPage,最後綁定到 0.0.0.0:8000
C.JSON是Gin實現的返回json數據的內置方法,包含了2個參數,狀態碼和返回的內容。http.StatusOK代表返回狀態碼為200,正文為{“message”: 「welcome”}。
註:Gin還包含更多的返回方法如c.String, c.HTML, c.XML等,請自行了解。可以方便的返回HTML數據
我們在之前的組v1路由下新定義一個路由:
下面我們訪問
可以看到,通過c.Param(「key」)方法,Gin成功捕獲了url請求路徑中的參數。同理,gin也可以捕獲常規參數,如下代碼所示:
在瀏覽器輸入以下代碼:
通過c.Query(「key」)可以成功接收到url參數,c.DefaultQuery在參數不存在的情況下,會由其默認值代替。
我們還可以為Gin定義一些默認路由:
這時候,我們訪問一個不存在的頁面:
返回如下所示:
下面我們測試在Gin裡面使用Post
在測試端輸入:
附帶發送的數據,測試即可。記住需要使用POST方法.
繼續修改,將PostHandler的函數修改如下
測試工具輸入:
發送的內容輸入:
返回結果如下:
備註:此處需要指定Content-Type為application/x-www-form-urlencoded,否則識別不出來。
一定要選擇對應的PUT或者DELETE方法。
Gin框架快速的創建路由
能夠方便的創建分組
支持url正則表達式
支持參數查找(c.Param c.Query c.PostForm)
請求方法精準匹配
支持404處理
快速的返回給客戶端數據,常用的c.String c.JSON c.Data
golang 有處理jsonpath嗎
JSON傳值的時候,如果有回車符就會掛的。我們可以使用正則來去掉回車符:
1 $str = preg_replace(“‘([\r\n])[\s]+'”, “”, $str);
2
3 // 不用正則
4 $str = str_replace(“\n”,””,$str);
轉出來的字元串就沒有回車符的困擾了。
順便記錄一個PHP過濾腳本:
01 ?php
02 // $document 應包含一個 HTML 文檔。
03 // 本例將去掉 HTML 標記,javascript 代碼
04 // 和空白字元。還會將一些通用的
05 // HTML 實體轉換成相應的文本。
06
07 $search = array (“‘script[^]*?.*?/script’si”, // 去掉 javascript
08 “‘[\/\!]*?[^]*?’si”, // 去掉 HTML 標記
09 “‘([\r\n])[\s]+'”, /
如何將Python的正則式轉換成Golang正則式
你的這一條正則表達式是要匹配「雙引號之間除換行之外的所有字元,並以名稱為first為名進行捕獲 但是,這裡卻使用了貌似只有Python支持的P
golang 正則 regexp包使用
先介紹幾種常用的方法:
1、使用MatchString函數或Match函數
regexp.MatchString(pattern string, s string) pattern為正則表達式,s為需要校驗的字元串
regexp.Match(pattern string, b []byte) pattern為正則表達式,s為需要校驗的字元串
它們的作用都是匹配,區別在於參數為字元串和切片
實例如下:
2、使用 Compile函數或MustCompile函數
它們的區別是Compile返回兩個參數 Regexp,error類型,而MustCompile只返回 Regexp類型
它們的作用是將正則表達式進行編譯,返回優化的 Regexp 結構體,該結構體有需多方法。
實例如下:
3、查找正則匹配字串( 註:函數名包含string的所傳參數為string 其他的均為[]byte 帶All是所有)
查找正則匹配的字元串位置( 註:函數名包含string的所傳參數為string 其他的均為[]byte 帶All是所有)
4、替換
正則替換
按原文替換
函數處理替換源字串
5、Regexp結構體中一些常用的方法
golang正則表達式 分組命名
正則中有分組這個功能,在golang中也可以使用命名分組。
一次匹配的情況
場景還原如下:
有一行文本,格式為:姓名 年齡 郵箱地址
請將其轉換為一個map
代碼實現如下:
str := `Alice 20 alice@gmail.com`
// 使用命名分組,顯得更清晰
re := regexp.MustCompile(`(?Pname[a-zA-Z]+)\s+(?Page\d+)\s+(?Pemail\w+@\w+(?:\.\w+)+)`)
match := re.FindStringSubmatch(str)
groupNames := re.SubexpNames()
fmt.Printf(“%v, %v, %d, %d\n”, match, groupNames, len(match), len(groupNames))
result := make(map[string]string)
// 轉換為map
for i, name := range groupNames {
if i != 0 name != “” { // 第一個分組為空(也就是整個匹配)
result[name] = match[i]
}
}
prettyResult, _ := json.MarshalIndent(result, “”, ” “)
fmt.Printf(“%s\n”, prettyResult)
輸出為:
[Alice 20 alice@gmail.com Alice 20 alice@gmail.com], [ name age email], 4, 4
{
“age”: “20”,
“email”: “alice@gmail.com”,
“name”: “Alice”
}
注意 [ name age email]有4個元素, 第一個為””。
多次匹配的情況
接上面的例子,實現一個更貼近現實的需求:
有一個文件, 內容大致如下:
Alice 20 alice@gmail.com
Bob 25 bob@outlook.com
gerrylon 26 gerrylon@github.com
…
更多內容
和上面一樣, 不過這次轉出來是一個slice of map, 也就是多個map。
代碼如下:
// 文件內容直接用字元串表示
usersStr := `
Alice 20 alice@gmail.com
Bob 25 bob@outlook.com
gerrylon 26 gerrylon@github.com
`
userRe := regexp.MustCompile(`(?Pname[a-zA-Z]+)\s+(?Page\d+)\s+(?Pemail\w+@\w+(?:\.\w+)+)`)
// 這裡要用FindAllStringSubmatch,找到所有的匹配
users := userRe.FindAllStringSubmatch(usersStr, -1)
groupNames := userRe.SubexpNames()
var result []map[string]string // slice of map
// 循環所有行
for _, user := range users {
m := make(map[string]string)
// 對每一行生成一個map
for j, name := range groupNames {
if j != 0 name != “” {
m[name] = strings.TrimSpace(user[j])
}
}
result = append(result, m)
}
prettyResult, _ := json.MarshalIndent(result, “”, ” “)
fmt.Println(string(prettyResult))
輸出為:
[
{
“age”: “20”,
“email”: “alice@gmail.com”,
“name”: “Alice”
},
{
“age”: “25”,
“email”: “bob@outlook.com”,
“name”: “Bob”
},
{
“age”: “26”,
“email”: “gerrylon@github.com”,
“name”: “gerrylon”
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
總結
使用命名分組可以使正則表示的意義更清晰。
轉換為map更加符合人類的閱讀習慣,不過比一般的根據索引取分組值麻煩一些。
————————————————
版權聲明:本文為CSDN博主「butterfly5211314」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/305037.html