Golang時間操作&JSON序列化與反序列化


時間操作

Time包

  1. 獲取當前時間
    t := time.Now()
    fmt.Printf("%T\n", t)   //time.Time
    fmt.Println(t)          //2019-07-08 15:23:55.1114609 +0800 DST m=+0.000192401
  1. 獲取指定的時間
    t := time.Date(2009, 7, 15, 16, 30, 28, 0, time.Local)
    fmt.Println(t)              //2009-07-15 16:30:28 +0800 DST
  1. 時間轉字符串
    t := time.Date(2009, 7, 15, 16, 30, 28, 0, time.Local)
    s1 := t.Format("2006年1月2日 15:04:05")
    fmt.Println(s1)              //2009年7月15日 16:30:28
    s2 := t.Format("2006-1-2 15:04:05")
    fmt.Println(s2)             //2009-7-15 16:30:28
    s3 := t.Format("2006/01/02")
    fmt.Println(s3)             //2009/07/15
  1. 字符串轉時間
s = "2019年10月10日"
t, err := time.Parse("2006年1月2日", s)
if err != nil {
    fmt.Println("err:", err)
}
fmt.Println(t)                  //2019-10-10 00:00:00 +0000 UTC
fmt.Printf("%T\n", t)           //time.Time
  1. 根據當前時間 獲取指定內容
    t := time.Now()
    year, month, day := t.Date()
    fmt.Println(year, month, day)   //2019 July 8

    hour, min, sec := t.Clock()
    fmt.Println(hour, min, sec)     //15 50 12

    years := t.Year()
    fmt.Println("年", years)        //年 2019
    fmt.Println(t.YearDay())        //189    當前日期在當年多少天
    months  := t.Month()
    fmt.Println("月", months)       //月 July
    days := t.Day()
    fmt.Println("日", days)         //日 8
    hours := t.Hour()
	fmt.Println("時", hours)          //15
    minutes := t.Minute()
	fmt.Println("分", minutes)        //59
    seconds := t.Second()
	fmt.Println("秒", seconds)        //18
    nanoseconds := t.Nanosecond()
	fmt.Println("納秒", nanoseconds)  //462754000
    weekday := t.Weekday()
	fmt.Println("星期",weekday)       //Monday
  1. 時間戳 (距離1970年1月1日0時0分0秒的時間差值)
    t1 := time.Date (1970, 1, 1, 1, 0, 0, 0, time.UTC)
    fmt.Println(t1.Unix())                  //3600 (秒的差值)
    t2 := time.Now()
    fmt.Println(t2.Unix())                  //1562573562

    fmt.Println(t1.UnixNano())              //3600000000000
    fmt.Println(t2.UnixNano())              //1562573562116878000
  1. 時間間隔
t1 := time.Now()
t2 := t1.Add(time.Minute)
fmt.Println(t1)                             //2019-07-08 16:17:46.4768441 +0800 DST m=+0.000175701
fmt.Println(t2)                             //2019-07-08 16:18:46.4768441 +0800 DST m=+60.000175701
fmt.Println(t1.Add(24 * time.Hour))         //2019-07-09 16:17:46.4768441 +0800 DST m=+86400.000175701

t3 := t1.AddDate(1, 0, 0)
fmt.Println(t3)                             //2020-07-08 16:19:42.9320107 +0800 DST

d := t2.Sub(t1)
fmt.Println(d)                              //1m0s
  1. 睡眠
time.Sleep(3 * time.Second)                 //程序睡眠3秒鍾

//睡眠隨機數
rand.Seed(time.Now().UnixNano())
randNum := rand.Intn(10) + 1
fmt.Println(randNum)
time.Sleep(time.Duration(randNum) * time.Second)
fmt.Println(randNum)

JSON序列化與反序列化

JSON

JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。https://www.json.cn/

  • 語法規則
    在 JS 語言中,一切都是對象。因此,任何支持的類型都可以通過 JSON 來表示.
  • 鍵/值對
    JSON 鍵值對是用來保存 JS 對象的一種方式,鍵/值對組合中的鍵名寫在前面並用雙引號 "" 包裹,使用冒號 : 分隔,然后緊接着值
    {"firstName": "Json"}
  • json 的序列化
    json 序列化是指,將有 key-value 結構的數據類型(比如結構體、map、切片)序列化成 json 字符串的操作。
  1. 結構體json序列化:
    type Monster struct {
        Name string
        Age int
        Birthday string
        Sal float64
        Skill string
    }

    func main() {
        monster := Monster{
            Name :"牛魔王",
            Age : 500 ,
            Birthday : "2011-11-11",
            Sal : 8000.0,
            Skill : "牛魔拳",
        }

        //將monster 序列化
        data, err := json.Marshal(&monster) //..
        if err != nil {
            fmt.Printf("序列號錯誤 err=%v\n", err)
        }
        //輸出序列化后的結果
        fmt.Printf("monster序列化后=%v\n", string(data))
    }
  1. map json序列化:
    func main() {
        //定義一個map
        var a map[string]interface{}
        //使用map,需要make
        a = make(map[string]interface{})
        a["name"] = "紅孩兒"
        a["age"] = 30
        a["address"] = "洪崖洞"

        //將a這個map進行序列化
        //將monster 序列化
        data, err := json.Marshal(a)
        if err != nil {
            fmt.Printf("序列化錯誤 err=%v\n", err)
        }
        //輸出序列化后的結果
        fmt.Printf("a map 序列化后=%v\n", string(data))
    }
  1. 切片json序列化:
    func main() {
        var slice []map[string]interface{}
        var m1 map[string]interface{}
        //使用map前,需要先make
        m1 = make(map[string]interface{})
        m1["name"] = "jack"
        m1["age"] = "7"
        m1["address"] = "北京"
        slice = append(slice, m1)

        var m2 map[string]interface{}
        //使用map前,需要先make
        m2 = make(map[string]interface{})
        m2["name"] = "tom"
        m2["age"] = "20"
        m2["address"] = [2]string{"墨西哥","夏威夷"}
        slice = append(slice, m2)

        //將切片進行序列化操作
        data, err := json.Marshal(slice)
        if err != nil {
            fmt.Printf("序列化錯誤 err=%v\n", err)
        }
        //輸出序列化后的結果
        fmt.Printf("slice 序列化后=%v\n", string(data))
        
    }
  1. 基本數據類型序列化

對基本數據類型進行序列化意義不大

    func main() {
        var num1 float64 = 2345.67

        //對num1進行序列化
        data, err := json.Marshal(num1)
        if err != nil {
            fmt.Printf("序列化錯誤 err=%v\n", err)
        }
        //輸出序列化后的結果
        fmt.Printf("num1 序列化后=%v\n", string(data))
    }

注意事項
對於結構體的序列化,如果我們希望序列化后的 key 的名字,又我們自己重新制定,那么可以給 struct指定一個 tag 標簽.

type Monster struct {
	Name string `json:"monster_name"` //反射機制
	Age int `json:"monster_age"`
	Birthday string `json:"monster_birthday"`
	Sal float64 `json:"monster_sal"`
	Skill string `json:"monster_skill"`
}

func testStruct() {
	//演示
	monster := Monster{
		Name :"牛魔王",
		Age : 500 ,
		Birthday : "2011-11-11",
		Sal : 8000.0,
		Skill : "牛魔拳",
	}

	//將monster 序列化
	data, err := json.Marshal(&monster) //..
	if err != nil {
		fmt.Printf("序列號錯誤 err=%v\n", err)
	}
	//輸出序列化后的結果
	fmt.Printf("monster序列化后=%v\n", string(data))

}
  • json 反序列化
    json 反序列化是指,將 json 字符串反序列化成對應的數據類型(比如結構體、map、切片)的操作
  1. json反序列化結構體:
    type Monster struct {
        Name string  
        Age int 
        Birthday string //....
        Sal float64
        Skill string
    }

    //演示將json字符串,反序列化成struct
    func main() {
        //說明str 在項目開發中,是通過網絡傳輸獲取到.. 或者是讀取文件獲取到
        str := "{\"Name\":\"牛魔王~~~\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"

        //定義一個Monster實例
        var monster Monster

        err := json.Unmarshal([]byte(str), &monster)
        if err != nil {
            fmt.Printf("unmarshal err=%v\n", err)
        }
        fmt.Printf("反序列化后 monster=%v monster.Name=%v \n", monster, monster.Name)
    }
  1. json反序列化map:
func main() {
	str := "{\"address\":\"洪崖洞\",\"age\":30,\"name\":\"紅孩兒\"}"
	//定義一個map
	var a map[string]interface{} 

	//反序列化
	//注意:反序列化map,不需要make,因為make操作被封裝到 Unmarshal函數
	err := json.Unmarshal([]byte(str), &a)
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 a=%v\n", a)

}
  1. json反序列化切片:
    func main() {
        str := "[{\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," + 
            "{\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]"
        
        //定義一個slice
        var slice []map[string]interface{}
        //反序列化,不需要make,因為make操作被封裝到 Unmarshal函數
        err := json.Unmarshal([]byte(str), &slice)
        if err != nil {
            fmt.Printf("unmarshal err=%v\n", err)
        }
        fmt.Printf("反序列化后 slice=%v\n", slice)
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM