本文目錄一覽:
- 1、golang正則表達式 分組命名
- 2、有沒有人用golang實現過restful框架的實例
- 3、Mac下交叉編譯linux golang程序
- 4、golang中bufio包
- 5、golang面試題2之判斷字符串中字符是否全都不同
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版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
有沒有人用golang實現過restful框架的實例
通過beego快速創建一個Restful風格API項目及API文檔自動化:
Go 語言構建 RESTful Web 服務:
Golang中使用 JWT認證來 保障Restful JSON API的安全(英文):
polaris: 一個用go實現的支持restful的web框架:
關於RESTFUL API 安全認證方式的一些總結:
有沒有人用golang實現過restful框架的實例:
Micro 一個用Go語言實現的微服務框架:
基於微服務庫的可插拔RPC go-micro:
golang適合做web開發嗎?:
a-survey-of-5-go-web-frameworks:
Ozzo Framework:
avelino/awesome-go:
Beego Framework:
golang其實不適合做web開發:
Go語言現有Web開發框架:
使用Golang快速構建WEB應用:
Martini 極好的 Go WEB 框架:
golang 有哪些比較穩定的 web 開發框架?:
Mac下交叉編譯linux golang程序
一、背景介紹
閑來無事,申請了台aws服務器在家搞點小東東,用golang做了個小東東,想放上去。自己的電腦是mac電腦,起初忘記了交叉編譯的事,直接編譯了下直接扔到aws,運行的時候出現了不可以運行的二進制格式提示。
二、交叉編譯的過程
1、隨手百度了下,很多文章都寫的“CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build”(不知你搜索到的是不是這個結果),看到這也挺簡單,分別是禁用cgo,指定目標系統,指定目標CPU體系架構,然後編譯。
按照百度出來的建議,嘗試在電腦上編譯了下,提示如下錯誤,如果沒有出現錯誤的可以不用往下看了哈。
2、如第一步所述,是將CGO關閉的狀態,如果程序用到了CGO,是不是就需要將CGO放開?將CGO放開又會是什麼現象?具體如下:
從上述的錯誤信息可以看出來,環境變量是生效的,確實是linux體系架構了。
3、繼續百度, 終於發現這篇文章非常不錯,在這裡和大家分享下,按照文章的操作就可以解決問題了,而且裡面有非常詳細的講解。
golang中bufio包
一、介紹go標準庫中的bufio
最近用golang寫了一個處理文件的腳本,由於其中涉及到了文件讀寫,開始使用golang中的 io 包,後來發現golang 中提供了一個bufio的包,使用這個包可以大幅提高文件讀寫的效率,於是在網上搜索同樣的文件讀寫為什麼bufio 要比io 的讀寫更快速呢?根據網上的資料和閱讀源碼,以下來詳細解釋下bufio的高效如何實現的。
bufio 包介紹
bufio包實現了有緩衝的I/O。它包裝一個io.Reader或io.Writer接口對象,創建另一個也實現了該接口,且同時還提供了緩衝和一些文本I/O的幫助函數的對象。
以上為官方包的介紹,在其中我們能了解到的信息如下:
bufio 是通過緩衝來提高效率
簡單的說就是,把文件讀取進緩衝(內存)之後再讀取的時候就可以避免文件系統的io 從而提高速度。同理,在進行寫操作時,先把文件寫入緩衝(內存),然後由緩衝寫入文件系統。看完以上解釋有人可能會表示困惑了,直接把 內容-文件 和 內容-緩衝-文件相比, 緩衝區好像沒有起到作用嘛。其實緩衝區的設計是為了存儲多次的寫入,最後一口氣把緩衝區內容寫入文件。下面會詳細解釋
bufio 封裝了io.Reader或io.Writer接口對象,並創建另一個也實現了該接口的對象
io.Reader或io.Writer 接口實現read() 和 write() 方法,對於實現這個接口的對象都是可以使用這兩個方法的
註明:介紹內容來自博主 LiangWenT
,原文鏈接: ,在查找資料時,發現這篇博客的內容很好理解
bufio包實現了緩存IO。它包裝了io.Reader和io.Write對象,創建了另外的Reader和Writer對象,它們也實現了io.Reader和io.Write接口,具有緩存。注意:緩存是放在主存中,既然是保存在主存里,斷電會丟失數據,那麼要及時保存數據。
二、常用內容
1、Reader類型
NewReaderSize
作用:NewReaderSize將rd封裝成一個帶緩存的bufio.Reader對象。緩存大小由size指定(如果小於16則會被設為16)。如果rd的基類型就是有足夠緩存的bufio.Reader類型,則直接將rd轉換為基類型返回。
NewReader
funcReader相當於NewReaderSize(rd, 4096)
Peek
Peek返回緩存的一個切片,該切片引用緩存中前n個字節的數據,該操作不會將數據讀出,只是引用,引用的數據在下一次讀取操作之前有效的。如果切片長度小於n,則返回一個錯誤信息說明原因。如果n大於緩存的總大小,則返回ErrBufferFull。
Read
Read從b中數據到p中,返回讀出的字節數和遇到的錯誤。如果緩存不為空,則只能讀出緩衝中的數據,不會從底層io.Reader中提取數據,如果緩存為空,則:
1、len(p) = 緩存大小,則跳過緩存,直接從底層io.Reader中讀出到p中
2、len(p) 緩存大小,則先將數據從底層io.Reader中讀取到緩存中,再從緩存讀取到p中。
Buffered
Buffered返回緩存中未讀取的數據的長度。
Discard
Discard跳過後續的n個字節的數據,返回跳過的字節數。
Writer類型和方法
write結構
NewWriteSize
NewWriterSize將wr封裝成一個帶緩存的bufio.Writer對象,緩存大小由size指定(如果小於4096則會被設置未4096)。
NewWrite
NewWriter相等於NewWriterSize(wr, 4096)
WriteString
WriteString功能同Write,只不過寫入的是字符串
WriteRune
WriteRune向b寫入r的UTF-8編碼,返回r的編碼長度。
Flush
Available
Available 返回緩存中未使用的空間的長度
Buffered
Buffered返回緩存中未提交的數據長度
Reset
Reset將b的底層Write重新指定為w,同時丟棄緩存中的所有數據,複位所有標記和錯誤信息。相當於創建了一個新的bufio.Writer。
GO中還提供了Scanner類型,處理一些比較簡單的場景。如處理按行讀取輸入序列或空格分隔的詞等。
內容來自:
參考鏈接:
1)
2)
golang面試題2之判斷字符串中字符是否全都不同
請實現 個算法,確定 個字符串的所有字符【是否全都不同】。這 我們要求【不允
許使 額外的存儲結構】。 給定 個string,請返回 個bool值,true代表所有字符全都
不同,false代表存在相同的字符。 保證字符串中的字符為【ASCII字符】。字符串的
度 於等於【3000】。
這 有 個重點,第 個是 ASCII字符 , ASCII字符 字符 共有256個,其中128個是常
字符,可以在鍵盤上輸 。128之後的是鍵盤上 法找到的。
然後是全部不同,也就是字符串中的字符沒有重複的,再次,不準使 額外的儲存結
構,且字符串 於等於3000。
如果允許其他額外儲存結構,這個題 很好做。如果不允許的話,可以使 golang內置
的 式實現。
通過 strings.Count 函數判斷:
使 的是golang內置 法 strings.Count ,可以 來判斷在 個字符串中包含
的另外 個字符串的數量
還有不同的方法同樣可以實現,你了解嗎?
推薦go相關技術 專欄
gRPC-go源碼剖析與實戰_帶你走進gRPC-go的源碼世界-CSDN博客
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/229147.html