新聞中心
golang正則表達(dá)式 分組命名
正則中有分組這個(gè)功能,在golang中也可以使用命名分組。

目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、水富網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
一次匹配的情況
場(chǎng)景還原如下:
有一行文本,格式為:姓名 年齡 郵箱地址
請(qǐng)將其轉(zhuǎn)換為一個(gè)map
代碼實(shí)現(xiàn)如下:
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)
// 轉(zhuǎn)換為map
for i, name := range groupNames {
if i != 0 name != "" { // 第一個(gè)分組為空(也就是整個(gè)匹配)
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個(gè)元素, 第一個(gè)為""。
多次匹配的情況
接上面的例子,實(shí)現(xiàn)一個(gè)更貼近現(xiàn)實(shí)的需求:
有一個(gè)文件, 內(nèi)容大致如下:
Alice 20 alice@gmail.com
Bob 25 bob@outlook.com
gerrylon 26 gerrylon@github.com
...
更多內(nèi)容
和上面一樣, 不過(guò)這次轉(zhuǎn)出來(lái)是一個(gè)slice of map, 也就是多個(gè)map。
代碼如下:
// 文件內(nèi)容直接用字符串表示
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
// 循環(huán)所有行
for _, user := range users {
m := make(map[string]string)
// 對(duì)每一行生成一個(gè)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
總結(jié)
使用命名分組可以使正則表示的意義更清晰。
轉(zhuǎn)換為map更加符合人類的閱讀習(xí)慣,不過(guò)比一般的根據(jù)索引取分組值麻煩一些。
————————————————
版權(quán)聲明:本文為CSDN博主「butterfly5211314」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
GO語(yǔ)言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用
GO是編譯性語(yǔ)言,所以函數(shù)的順序是無(wú)關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫(xiě)在最前面,其余函數(shù)按照功能需要進(jìn)行排列
GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)
GO的函數(shù) 支持 無(wú)需聲明變量,可變長(zhǎng)度,多返回值,匿名,閉包等
GO的函數(shù)用 func 來(lái)聲明,且左大括號(hào) { 不能另起一行
一個(gè)簡(jiǎn)單的示例:
輸出為:
參數(shù):可以傳0個(gè)或多個(gè)值來(lái)供自己用
返回:通過(guò)用 return 來(lái)進(jìn)行返回
輸出為:
上面就是一個(gè)典型的多參數(shù)傳遞與多返回值
對(duì)例子的說(shuō)明:
按值傳遞:是對(duì)某個(gè)變量進(jìn)行復(fù)制,不能更改原變量的值
引用傳遞:相當(dāng)于按指針傳遞,可以同時(shí)改變?cè)瓉?lái)的值,并且消耗的內(nèi)存會(huì)更少,只有4或8個(gè)字節(jié)的消耗
在上例中,返回值 (d int, e int, f int) { 是進(jìn)行了命名,如果不想命名可以寫(xiě)成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:
當(dāng)返回了多個(gè)值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來(lái)補(bǔ)位,例如上例的返回我們可以寫(xiě)成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來(lái)舍棄掉
在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個(gè)可變長(zhǎng)度的參數(shù)
輸出為:
在上例中, strs ...string 中, strs 的實(shí)際值是b,c,d,e,這就是一個(gè)最簡(jiǎn)單的傳遞可變長(zhǎng)度的參數(shù)的例子,更多一些演變的形式,都非常類似
在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對(duì)像中的析構(gòu)函數(shù),也就是在某個(gè)函數(shù)執(zhí)行完成后,GO會(huì)自動(dòng)這個(gè);
如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進(jìn)后出;
當(dāng)某個(gè)函數(shù)出現(xiàn)嚴(yán)重錯(cuò)誤時(shí), defer 也會(huì)被調(diào)用
輸出為
這是一個(gè)最簡(jiǎn)單的測(cè)試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時(shí),判斷是哪個(gè)函數(shù)出了問(wèn)題,完全可以根據(jù) defer 打印出來(lái)的內(nèi)容來(lái)進(jìn)行判斷,非??焖伲@種留給你們?nèi)?shí)現(xiàn)
一個(gè)函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時(shí),經(jīng)常會(huì)將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用
本篇重點(diǎn)介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct
4.2 Go語(yǔ)言中包(Packages)的命名
包名本質(zhì)上是所在目錄的名稱,我們?cè)诨A(chǔ)知識(shí)演示用例中進(jìn)行擴(kuò)展,進(jìn)一步理解包名,執(zhí)行前需要執(zhí)行的命令請(qǐng)參考上一節(jié),首先來(lái)看一下目錄結(jié)構(gòu):
此時(shí),如果我們想使用subpackage/sub/subfunc.go時(shí),需要import的是subpackage/sub,而不是subpackage/sub/subfunc,來(lái)看具體的實(shí)現(xiàn):
我們回到使用的主函數(shù)中,我們?cè)谥骱瘮?shù)中引入"subpackage/sub",而調(diào)用中直接使用了文件名稱myfunc
執(zhí)行的結(jié)果如下
本文標(biāo)題:go語(yǔ)言的命名,go語(yǔ)言命名規(guī)范
新聞來(lái)源:http://www.dlmjj.cn/article/dsssohi.html


咨詢
建站咨詢
