本文目錄一覽:
- 1、弱弱的問下golang跟erlang區別大嗎
- 2、為什麼在gomail申請郵箱,驗證碼老是錯誤?
- 3、網路:什麼是 MIME TYPE?
- 4、golang正則表達式 分組命名
- 5、Go 使用 gomail 發送郵件
弱弱的問下golang跟erlang區別大嗎
1. 對鎖的態度不同;
2. 對非同步IO的態度不同;
3. 消息機制不同;
4. Erlang對鎖非常反感,認為變數不可變可以很大程度避免鎖;而Golang的觀點是鎖確實有很大的負擔,但鎖基本上是無法避免的,一旦有人共享狀態並且互相搶佔去改變他,這時候鎖是必須存在的。
Erlang伺服器是單進程的,是邏輯上沒有並發的東西,一個Process就是一個執行體,所以Erlang的伺服器和Golang的伺服器是不一樣的,Golang的伺服器是多進程的一起構成的一個伺服器,每個請求建立一個獨立的進程。
而Erlang不同,一個伺服器就是一個單進程的,所以並發的請求都進入到了進程的郵箱,然後這個伺服器從進程郵箱里取郵件處理,Erlang的伺服器並沒有並發的請求,所以不需要鎖。
為什麼在gomail申請郵箱,驗證碼老是錯誤?
輸入時候注意大小寫,並且不要刷新頁面,另外請注意網路延遲,當你註冊點下確定以後耐心等待,千萬不要連續點下確定,否則會造成錯誤出現
網路:什麼是 MIME TYPE?
最近在讀 Golang 的源碼,看到 mime.go 這個文件時,有點看不懂了。
MIME, Mutipurpose Internet Mail Extensions,多用途 Internet 郵箱擴展。MIME 是描述消息內容類型的 internet 標準。在創建之初,是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程序根據其類型進行處理。現在 MIME TYPE 被 HTTP 協議支持後,使得HTTP能夠傳輸各種各樣的文件。
瀏覽器通過 MIME TYE,也就是該資源的媒體類型,來決定以什麼形式顯示數據。
媒體類型通常是通過 HTTP 協議,由 Web 伺服器請求頭中的 Content-Type 來告知瀏覽器數據類型的,比如:
表示內容是 text/HTML 類型,也就是超文本文件。注意,必須是 “text/HTML” 而不是 “HTML/text”.因為 MIME 是經過 ietf 組織協商,以 RFC 的形式發布在網上的。
需要注意的是: 只有一些在互聯網上獲得廣泛應用的格式才會獲得一個 MIME Type ,如果是某個客戶端自己定義的格式,一般只能以 application/x- 開頭。
Internet 中有一個專門組織來對 MIME 標準進行修訂,但是由於 Internet 發展過快,很多應用程序便使用在類別中以 x- 開頭的方法標識這個類別還沒有成為標準,例如 x-gzip,x-tar等。
其實是不是標準無關緊要,只要客戶端和伺服器都能識別這個格式就可以了。在 app 端會使用自定義標準來保證數據安全。
MIME類型與文檔的後綴相關,因此伺服器使用文檔的後綴來區分不同文件的 MIME 類型,伺服器中必須規定文件後綴和MIME類型之間的對應關係。而客戶端從伺服器上接收數據的時候,它只是從伺服器接收數據流,並不了解文檔的名字,因此伺服器需要使用附加信息來告訴客戶程序數據的 MIME 類型。伺服器將首先發送以下兩行 MIME 標識信息,這個信息並不是真正的數據文件的一部分。
注意,第二行為一個空格,這是必須的,使用這個空行的目的是將 MIME 信息與真正的數據內容分離開。
通用結構: type/subtype
MIME 類型對大小寫不敏感,但是通常傳統寫法是小寫。
分類
對於 text 文件類型若是沒有特定的 subtype,就使用 text/plain, 類似的二進位文件如果沒有特定或已知的 subtype,就使用 application/octet-stream.
還有非MIME 類型,但是比較通用的 icon 類型,image/x-icon
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版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
Go 使用 gomail 發送郵件
我們使用 gomail 這個庫來發送郵件
使用 Goruntine 來並發發送郵件。
原創文章,作者:CLYL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134269.html