進入到常用函式庫第三天,也是最後一天介紹一些 stdlib 的應用,後續章節還會有一些第三方 lib 的介紹

encoding/json

我想在這個萬物皆是 web 的時代,json 是一個不可或缺的格式,那就來來看看,怎麼使用 json

package main

import (
	"encoding/json"
	"fmt"
)

type UserInfo struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	var jsonString string
	jsonString = `{"name":"syhlion","age":5}`

	//把 json unmarshal 進去 struct
	u := &UserInfo{}
	err := json.Unmarshal([]byte(jsonString), u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("name:%s, age:%d\n", u.Name, u.Age)

	//把 struct 轉成 json 字串
	b, err := json.Marshal(u)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b))

}

https://play.golang.org/p/F_Rx5uETe2c

這邊有用到一個 golang 很特殊的小功能叫做 struct tags,就是在上面範例中 UserInfo 每個 field 後面的 json tag,需要更多的說明可以參閱官網

regexp

正則表達式,也是各種應用中不可或缺的一個基礎功能。

package main

import (
	"fmt"
	"regexp"
)

func main() {
	re := regexp.MustCompile(`^([0-9]{3})(.*)`)
	m := re.MatchString("2345Abc")
	fmt.Println("234Abc is match patter ? ", m)

	ss := re.FindStringSubmatch("2345Abc")
	fmt.Println("sub match array ", ss)
}

https://play.golang.org/p/AE4ig9mJv5n

在這邊要注意一下,golang 的正則表達式是基於 google 開發的 re2 來實現的,因為這是為了解決目前現有的正則式演算法,時間複雜並無固定的保證,所開發出來的。所以一些常見的遞迴搜尋在 re2 上面是不能使用的。