golangcsdn的簡單介紹

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 12:08
下一篇 2024-12-10 12:08

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的“畫筆”在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智能,Python都扮演着重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進制下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27

發表回復

登錄後才能評論