文本處理
Web開發中對于文本處理是非常重要的一部分,我們往往需要對輸出或者輸入的內容進行處理,這里的文本包括字串、數字、Json、XML等等,Go語言作為一門高性能的語言,對這些文本的處理都有官方的標準庫來支持,而且在你使用中你會發現Go標準庫的一些設計相當的巧妙,而且對于使用者來說也很方便就能處理這些文本,
XML處理
XML作為一種資料交換和資訊傳遞的格式已經十分普及,而隨著Web服務日益廣泛的應用,現在XML在日常的開發作業中也扮演了愈發重要的角色
決議XML
如何決議如上這個XML檔案呢? 我們可以通過xml包的Unmarshal函式來達到我們的目的
func Unmarshal(data []byte, v interface{}) error
data接收的是XML資料流,v是需要輸出的結構,定義為interface,也就是可以把XML轉換為任意的格式,我們這里主要介紹struct的轉換,因為struct和XML都有類似樹結構的特征,
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)
type Recurlyservers struct {
XMLName xml.Name `xml:"servers"`
Version string `xml:"version,attr"`
Svs []server `xml:"server"`
Description string `xml:",innerxml"`
}
type server struct {
XMLName xml.Name `xml:"server"`
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
func main() {
file, err := os.Open("servers.xml") // For read access.
if err != nil {
fmt.Printf("error: %v", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := Recurlyservers{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
}
輸出XML
假若我們不是要決議如上所示的XML檔案,而是生成它,那么在go語言中又該如何實作呢? xml包中提供了Marshal和MarshalIndent兩個函式,來滿足我們的需求,這兩個函式主要的區別是第二個函式會增加前綴和縮進,函式的定義如下所示:
func Marshal(v interface{}) ([]byte, error)
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
兩個函式第一個引數是用來生成XML的結構定義型別資料,都是回傳生成的XML資料流,
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Servers struct {
XMLName xml.Name `xml:"servers"`
Version string `xml:"version,attr"`
Svs []server `xml:"server"`
}
type server struct {
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
func main() {
v := &Servers{Version: "1"}
v.Svs = append(v.Svs, server{"Shanghai_VPN", "127.0.0.1"})
v.Svs = append(v.Svs, server{"Beijing_VPN", "127.0.0.2"})
output, err := xml.MarshalIndent(v, " ", " ")
if err != nil {
fmt.Printf("error: %v\n", err)
}
os.Stdout.Write([]byte(xml.Header))
os.Stdout.Write(output)
}
上面我們介紹了如何使用Go語言的xml包來編/解碼XML檔案,重要的一點是對XML的所有操作都是通過struct tag來實作的,所以學會對struct tag的運用變得非常重要
JSON處理
JSON(Javascript Object Notation)是一種輕量級的資料交換語言,以文字為基礎,具有自我描述性且易于讓人閱讀,盡管JSON是Javascript的一個子集,但JSON是獨立于語言的文本格式,并且采用了類似于C語言家族的一些習慣,JSON與XML最大的不同在于XML是一個完整的標記語言,而JSON不是,JSON由于比XML更小、更快,更易決議,以及瀏覽器的內建快速決議支持,使得其更適用于網路資料傳輸領域,目前我們看到很多的開放平臺,基本上都是采用了JSON作為他們的資料互動的介面,既然JSON在Web開發中如此重要,那么Go語言對JSON支持的怎么樣呢?Go語言的標準庫已經非常好的支持了JSON,可以很容易的對JSON資料進行編、解碼的作業,
決議json
package main
import (
"encoding/json"
"fmt"
)
type Server struct {
ServerName string
ServerIP string
}
type Serverslice struct {
Servers []Server
}
func main() {
var s Serverslice
str := `{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"127.0.0.2"}]}`
json.Unmarshal([]byte(str), &s)
fmt.Println(s)
}
上面這個是官方提供的解決方案,其實很多時候我們通過型別斷言,操作起來不是很方便,目前bitly公司開源了一個叫做simplejson的包,在處理未知結構體的JSON時相當方便,詳細例子如下所示:
js, err := NewJson([]byte(`{
"test": {
"array": [1, "2", 3],
"int": 10,
"float": 5.150,
"bignum": 9223372036854775807,
"string": "simplejson",
"bool": true
}
}`))
arr, _ := js.Get("test").Get("array").Array()
i, _ := js.Get("test").Get("int").Int()
ms := js.Get("test").Get("string").MustString()
生成json
package main
import (
"encoding/json"
"fmt"
)
type Server struct {
ServerName string
ServerIP string
}
type Serverslice struct {
Servers []Server
}
func main() {
var s Serverslice
s.Servers = append(s.Servers, Server{ServerName: "Shanghai_VPN", ServerIP: "127.0.0.1"})
s.Servers = append(s.Servers, Server{ServerName: "Beijing_VPN", ServerIP: "127.0.0.2"})
b, err := json.Marshal(s)
if err != nil {
fmt.Println("json err:", err)
}
fmt.Println(string(b))
}
正則處理
正則運算式是一種進行模式匹配和文本操縱的復雜而又強大的工具,雖然正則運算式比純粹的文本匹配效率低,但是它卻更靈活,按照它的語法規則,隨需構造出的匹配模式就能夠從原始文本中篩選出幾乎任何你想要得到的字符組合,如果你在Web開發中需要從一些文本資料源中獲取資料,那么你只需要按照它的語法規則,隨需構造出正確的模式字串就能夠從原資料源提取出有意義的文本資訊,
Go語言通過regexp標準包為正則運算式提供了官方支持,如果你已經使用過其他編程語言提供的正則相關功能,那么你應該對Go語言版本的不會太陌生,但是它們之間也有一些小的差異,因為Go實作的是RE2標準,除了\C,詳細的語法描述參考:http://code.google.com/p/re2/wiki/Syntax
其實字串處理我們可以使用strings包來進行搜索(Contains、Index)、替換(Replace)和決議(Split、Join)等操作,但是這些都是簡單的字串操作,他們的搜索都是大小寫敏感,而且固定的字串,如果我們需要匹配可變的那種就沒辦法實作了,當然如果strings包能解決你的問題,那么就盡量使用它來解決,因為他們足夠簡單、而且性能和可讀性都會比正則好,
通過正則判斷是否匹配
regexp包中含有三個函式用來判斷是否匹配,如果匹配回傳true,否則回傳false
func Match(pattern string, b []byte) (matched bool, error error)
func MatchReader(pattern string, r io.RuneReader) (matched bool, error error)
func MatchString(pattern string, s string) (matched bool, error error)
上面的三個函式實作了同一個功能,就是判斷pattern是否和輸入源匹配,匹配的話就回傳true,如果決議正則出錯則回傳error,三個函式的輸入源分別是byte slice、RuneReader和string,
這把整個regexp包都講了講,講的還挺細!!!
模板處理
什么是模板?
你一定聽說過一種叫做MVC的設計模式,Model處理資料,View展現結果,Controller控制用戶的請求,至于View層的處理,在很多動態語言里面都是通過在靜態HTML中插入動態語言生成的資料,例如JSP中通過插入<%=....=%>,PHP中通過插入<?php.....?>來實作的,
Web應用反饋給客戶端的資訊中的大部分內容是靜態的,不變的,而另外少部分是根據用戶的請求來動態生成的,例如要顯示用戶的訪問記錄串列,用戶之間只有記錄資料是不同的,而串列的樣式則是固定的,此時采用模板可以復用很多靜態代碼,
Go模板使用
在Go語言中,我們使用template包來進行模板處理,使用類似Parse、ParseFile、Execute等方法從檔案或者字串加載模板,然后執行類似上面圖片展示的模板的merge操作,請看下面的例子:
func handler(w http.ResponseWriter, r *http.Request) {
t := template.New("some template") //創建一個模板
t, _ = t.ParseFiles("tmpl/welcome.html") //決議模板檔案
user := GetUser() //獲取當前用戶資訊
t.Execute(w, user) //執行模板的merger操作
}
通過上面的例子我們可以看到Go語言的模板操作非常的簡單方便,和其他語言的模板處理類似,都是先獲取資料,然后渲染資料,
通過模板技術的應用,我們可以完成MVC模式中V的處理
檔案操作
在任何計算機設備中,檔案是都是必須的物件,而在Web編程中,檔案的操作一直是Web程式員經常遇到的問題,檔案操作在Web應用中是必須的,非常有用的,我們經常遇到生成檔案目錄,檔案(夾)編輯等操作,這本書把Go中的這些操作做一詳細總結并實體示范如何使用,
字串處理
字串在我們平常的Web開發中經常用到,包括用戶的輸入,資料庫讀取的資料等,我們經常需要對字串進行分割、連接、轉換等操作,這一小節將通過Go標準庫中的strings和strconv兩個包中的函式來講解如何進行有效快速的操作,
string主要是對字串進行操作,strconv主要是進行字串與其他資料型別的轉換,
這一章介紹了一些文本處理的工具,包括XML、JSON、正則和模板技術,XML和JSON是資料互動的工具,通過XML和JSON你可以表達各種含義,通過正則你可以處理文本(搜索、替換、截取),通過模板技術你可以展現這些資料給用戶,這些都是你開發Web應用程序中需要用到的技術,通過這個小節的介紹你能夠了解如何處理文本、展現文本,
鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49405.html
標籤:Go
下一篇:goweb-web服務
