GO 语言进阶之 时间处理和Json 处理

发布于:2025-05-26 ⋅ 阅读:(65) ⋅ 点赞:(0)

更多个人笔记见:
github个人笔记仓库
gitee 个人笔记仓库
个人学习,学习过程中还会不断补充~ (后续会更新在github上)

时间处理

时间格式化必须使用:2006-01-02 15:04:05 这个时间为参考!!

基本例子

包括常见的时间操作

package main

import (
	"fmt"
	"time"
)

func main() {
	// 1. 获取当前时间
	now := time.Now()
	fmt.Printf("当前时间: %v\n", now)
    //当前时间: 2025-05-25 20:14:42.296858 +0800 CST m=+0.000238334

	// 2. 获取时间组成部分
	fmt.Printf("年: %d 月: %d 日: %d 时: %d 分: %d 秒: %d\n",
		now.Year(), now.Month(), now.Day(),
		now.Hour(), now.Minute(), now.Second())

	// 3. 格式化时间输出
	fmt.Println("标准格式:", now.Format("2006-01-02 15:04:05"))
	fmt.Println("简写格式:", now.Format("2006/01/02"))  
	fmt.Println("时间戳:", now.Unix())
    //标准格式: 2025-05-25 20:14:42
    //简写格式: 2025/05/25
    //时间戳: 1748175282

	// 4. 时间计算
	oneHourLater := now.Add(time.Hour)
	fmt.Println("1小时后:", oneHourLater)
    //1小时后: 2025-05-25 21:14:42.296858 +0800 CST m=+3600.000238334

	tomorrow := now.AddDate(0, 0, 1)
	fmt.Println("明天:", tomorrow.Format("2006-01-02"))
    //明天: 2025-05-26

	// 5. 时间比较
	if now.Before(oneHourLater) { //比较前后时间
		fmt.Println("当前时间在1小时前")
	}

	// 6. 定时器
	timer := time.NewTimer(2 * time.Second)  //NewTimer 创建定时器
	<-timer.C //阻塞等待定时器
	fmt.Println("2秒时间到") 

	// 7. 定时任务
	ticker := time.NewTicker(1 * time.Second)
	go func() {
		for t := range ticker.C {
			fmt.Println("定时执行:", t.Format("15:04:05"))
		}
	}()

	// 8. 解析字符串为时间 !! 
	timeStr := "2023-01-02 15:04:05" //先以字符串的标准形式表示
	parsedTime, err := time.Parse("2006-01-02 15:04:05", timeStr)
	if err != nil {
		panic(err)
	}
	fmt.Println("解析后的时间:", parsedTime)
    //解析后的时间: 2023-01-02 15:04:05 +0000 UTC

	// 9. 睡眠  ->  为了完成 7 定时任务
	time.Sleep(5 * time.Second)
	ticker.Stop()
	fmt.Println("程序结束")
}

Json处理

Json化后方便网络通信等传输,主要特点其实就是对第一个字母进行处理

基础案例

type userInfo struct {
	Name  string   `json:"Name"`
	Age   int      `json:"age"`
	Hobby []string `json:"Hobby"`
}

func main() {
	a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}

	// 普通JSON编码
	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}

	// 带缩进的JSON编码
	indentBuf, err := json.MarshalIndent(a, "", "\t")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(indentBuf)) //如果不是 string 会以数字形式输出
	/*
		{
			"Name": "wang",
			"age": 18,
			"Hobby": [
				"Golang",
				"TypeScript"
			]
		}
	*/

	// JSON解码
	var b userInfo
	err = json.Unmarshal(buf, &b) //解码然后放入 b 中
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
}
  • 似乎在定义结构体的 json 的时候出一些错误都是可以被 Unmarshal 正确重新放回去的(不过 Marshal 的时候就会带有一点错误地放入)
    还是老实定义 json 就好
  • 记住需要编为 json 后,string 来输出,不然就是一串数字

网站公告

今日签到

点亮在社区的每一天
去签到