Go 語言編程實例(五)

本節(jié)主要分享:延遲(defer),集合,字符串函數(shù),字符串格式。

以下代碼在存放于github中如下倉庫:github

Go延遲(defer)實例

defer用于確保稍后在程序執(zhí)行中執(zhí)行函數(shù)調(diào)用,通常用于清理目的。延遲(defer)常用于例如,ensurefinally 常見于其他編程語言中。

假設(shè)要創(chuàng)建一個文件,寫入內(nèi)容,然后再完成之后關(guān)閉。這里可以這樣使用延遲(defer)處理。

在使用 createFile 獲取文件對象后,立即使用closeFile推遲該文件的關(guān)閉。這將在writeFile() 完成后封裝函數(shù) (main)結(jié)束時執(zhí)行。

package main

import (
    "os"
    "fmt"
)

func main(){
    f := createFile("defer_panic_test.txt")
    defer closeFile(f)
    writeFile(f)
}

func createFile(p string) *os.File{
    fmt.Println("creating")
    f,err := os.Create(p)
    if err != nil{
        panic(err)
    }
    return f
}

func writeFile(f *os.File){
    fmt.Println("writing")
    fmt.Fprintln(f,"data")
}

func closeFile(f *os.File){
    fmt.Println("closing")
    f.Close()
}

Go 集合函數(shù)實例

我們經(jīng)常需要在程序中對數(shù)據(jù)集合執(zhí)行操作,例如選擇滿足給定集合的項目,或者將所有項目映射到具有自定義函數(shù)的新集合。

在某些語言中,通用數(shù)據(jù)結(jié)構(gòu)和算法是慣用的。Go 不支持泛型。

這里是一些字符串切片的示例收集函數(shù)??梢允褂眠@些示例來構(gòu)建自己的函數(shù)。注意,某些情況下,直接內(nèi)聯(lián)集合操作代碼可能是最清楚的,而不用創(chuàng)建和調(diào)用輔助函數(shù)。

代碼實現(xiàn)功能如下:返回目標(biāo)字符串 t 的第一個索引,如果沒找到就返回 -1 。如果目標(biāo)字符串 t 在切片中,則返回 true。如果切片中的第一個字符串滿足詞 f ,則返回 true。 如果切片中所有的字符串都滿足 f ,則返回 true。返回一個新的切片,包含將函數(shù) f 應(yīng)用于原始切片中的每一個字符串的結(jié)果。

package main

import (
    "fmt"
    "strings"
)

//找尋單詞排第幾
func Index(vs []string,t string ) int{
    for i,v := range vs {
        if v == t {
            return i
        }
    }
    return -1
}

//判斷是否包含有該單詞
func Include(vs []string,t string) bool{
    return Index(vs,t)>=0
}

//當(dāng)含有目標(biāo)單詞,返回true
func Any(vs []string, f func(string) bool) bool{
    for _,v := range vs{
        if f(v) {
            return true
        }
    }
    return false
}
//當(dāng)所有單詞都在里面時,才返回true
func All(vs [] string,f func(string)bool)bool{
    for _,v := range vs{
        if !f(v){
            return false
        }
    }
    return true
}

//過濾包含某單詞的
func Filter(vs []string, f func(string)bool) []string{
    vsf := make([]string , 0)
    for _,v := range vs {
        if f(v){
            vsf = append(vsf,v)
        }
    }
    return vsf
}
//新切片
func Map(vs []string, f func(string)string)[]string{
    vsm := make([]string,len(vs))
    for i,v := range vs{
        vsm[i] = f(v)
    }
    return vsm
}

func main(){
    var strs = []string{"peach","apple","pear","plum"}

    fmt.Println(Index(strs,"pear"))

    fmt.Println(Include(strs,"grape"))

    fmt.Println(Any(strs, func(v string) bool {
        return strings.HasPrefix(v,"p")
    }))

    fmt.Println(All(strs, func(v string) bool {
        return strings.HasPrefix(v,"p")
    }))

    fmt.Println(Filter(strs, func(v string) bool {
        return strings.Contains(v,"e")
    }))

    fmt.Println(Map(strs,strings.ToUpper))

}

Go字符串函數(shù)實例

標(biāo)準(zhǔn)庫的字符串包提供了許多有用的字符串相關(guān)函數(shù)。這里有一些例子就像是用一個包的感覺。將 fmt.Println 取一個別名,縮寫成一個較短的名稱,下面示例代碼中將使用它。

下面是一些來自包的函數(shù),而不是字符串對象本身的方法,所以我們需要將待處理字符串作為函數(shù)的第一個參數(shù)傳入。還有更多的函數(shù)可以在 字符串包 的文檔中找到。

注意: Len 函數(shù)和索引均工作在字節(jié)級別上。Go 使用 UTF-8 編碼字符串,如果使用潛在的多字節(jié)字符,將需要使用編碼轉(zhuǎn)換操作。

package main

import (
    "fmt"
    s "strings"
)

var p = fmt.Println


func main(){

    //在 http://golang.org/pkg/strings/ 中有更多的解釋
    p("Contains:  ",s.Contains("test","es"))

    p("Count:     ",s.Count("Test","t"))
    p("HasPrefix: ",s.HasPrefix("test","te"))
    p("HasSuffix: ",s.HasSuffix("test","st"))
    p("Index:     ",s.Index("test","e"))
    p("Join:      ",s.Join([]string{"a","b"},"-"))
    p("Repeat:    ",s.Repeat("a",5))
    p("Replace:   ",s.Replace("foo","o","0",-1))
    p("Replace:   ",s.Replace("foo","o","0",1))
    p("Split:     ",s.Split("a-b-c-d-e","-"))
    p("ToLoer:    ",s.ToLower("TEST"))
    p("ToUpper:   ",s.ToUpper("test"))
    p()

    p("Len:       " ,len("Hello"))
    p("Char:       ","Hello"[1])

}

Go字符串格式實例

Go 語言為傳統(tǒng)的 Printf 字符串格式化輸出提供了極好的支持。以下是常見的字符串格式化示例。

Go 提供了幾種打印動詞,設(shè)計用于格式化一般的值。

如果值是一個結(jié)構(gòu)體, %+v 變體將包括結(jié)構(gòu)體的字段名。

%#v 變體打印Go語法表示,將會生成該值的源代碼片段。

要打印值的類型,請使用 %T。格式化布爾是比較直接了當(dāng)?shù)?。有許多格式化整數(shù)的選項。對于標(biāo)準(zhǔn)的 base-10 格式化,請使用 %d

package main

import (
    "fmt"
    "os"
)

type point struct {
    x,y int
}

func main(){
    p := point{1,2}
    fmt.Printf("%v\n" ,p)
    fmt.Printf("%+v\n",p)
    fmt.Printf("%#v\n",p)
    fmt.Printf("%T\n" ,p)

    fmt.Printf("%t\n",true)

    fmt.Printf("%d\n",123)

    //二進制形式打印
    fmt.Printf("%b\n",p)
    //字符串形式
    fmt.Printf("%c\n",33)
    //十六進制
    fmt.Printf("0x%x\n",456)
    //浮點
    fmt.Printf("%f\n",78.9)

    //不同的科學(xué)計數(shù)法
    fmt.Printf("%e\n",123400000.0)
    fmt.Printf("%E\n",123400000.0)

    //基本字符串輸出
    fmt.Printf("%s\n","\"string\"")

    fmt.Printf("%q\n","\"string\"")
    //十六進制打印
    fmt.Printf("%x\n","hex this")
    //指針
    fmt.Printf("%p\n",&p)

    /*含間距格式化*/
    fmt.Printf("|%6d|%6d|\n",12,345)
    //使用 - 可以左對齊
    fmt.Printf("|%-6.2f|%-6.2f|\n",1.2,3.45)
    fmt.Printf("|%6.2f|%6.2f|\n",1.2,3.45)

    fmt.Printf("|%6s|%6s|\n","foo","b")
    fmt.Printf("|%-6s|%-6s|\n","foo","b")

    //sprintf也有的
    s := fmt.Sprintf("a %s","string")
    fmt.Println(s)

    //錯誤通道打印信息
    fmt.Fprintf(os.Stderr,"an %s\n","error")
}

Go 正則表達式實例

Go 提供了對正則表達式的內(nèi)置支持,下面是Go 常見的 regexp 的一部分例子。正則表達式本身很強大,規(guī)則需要多用才能夠熟練。

package main

import (
    "regexp"
    "fmt"
    "bytes"
)

func main(){
    //測試規(guī)則是否能匹配字符串
    match,_:=regexp.MatchString("p([a-z]+)ch","peach")
    fmt.Println(match)

    //使用regexp其他函數(shù)的時候需要先 使用 compile 函數(shù)進行優(yōu)化
    r,_:= regexp.Compile("p([a-z]+)ch")

    fmt.Println(r.MatchString("peach"))
    //找尋符合規(guī)則的字符串
    fmt.Println(r.FindString("peach punch"))
    //找尋符合規(guī)則的字符串所在位置 這里返回時開始和結(jié)束的位置
    fmt.Println(r.FindStringIndex("peach punch"))
    //匹配 "p([a-z]+)ch" 和 "([a-z]+)" 兩個表達式
    fmt.Println(r.FindStringSubmatch("peach punch"))
    //匹配上面兩個表達式找到的字符所在的位置
    fmt.Println(r.FindStringSubmatchIndex("peach punch"))
    //找尋所有符合的字符串
    fmt.Println(r.FindAllString("peach punch pinch",-1))
    //找尋所有子規(guī)則符合的字符串所在位置
    fmt.Println(r.FindAllStringSubmatchIndex("peach punch pinch",-1))
    //限制只找兩個
    fmt.Println(r.FindAllString("peach punch pinch",2))

    fmt.Println(r.Match([]byte("peach")))

    r = regexp.MustCompile("p([a-z]+)ch")
    fmt.Println(r)

    fmt.Println(r.ReplaceAllString("a peach","<fruit>"))

    in  := []byte("a peach")
    out := r.ReplaceAllFunc(in,bytes.ToUpper)
    fmt.Println(string(out))
}

如需進一步討論可以加群:295023494

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 出處---Go編程語言 歡迎來到 Go 編程語言指南。本指南涵蓋了該語言的大部分重要特性 Go 語言的交互式簡介,...
    Tuberose閱讀 18,737評論 1 46
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,590評論 19 139
  • 官方網(wǎng)站:https://golang.org/標(biāo)準(zhǔn)庫文檔:https://golang.org/pkg/在線編碼...
    技術(shù)學(xué)習(xí)閱讀 2,416評論 2 39
  • 郭相麟 出門在外冷暖自知,某天下午我的時間在走錯路、繞遠路,來回倒騰中度過! 方向不清晰,依賴著導(dǎo)航給出的方向...
    郭相麟閱讀 296評論 0 0
  • 那條路 想來只是一條寂寥的單行道 沿途沒有依稀可識的物種 供你回來時認(rèn)領(lǐng),你 還會回來的嗎 翻開漸行漸遠的往事 往...
    江城妖怪閱讀 342評論 1 3

友情鏈接更多精彩內(nèi)容