常用库
fmt
占位符 | 说明 |
%v | 按原本的值来输出 |
%+v | 类似%v,但输出结构体是会加上字段名称 |
%#v | 在%+v的基础上额外输出类型 |
%T | 输出类型 |
%s | 输出字符串或者[]byte |
%d | 表示十进制 |
- Println:
- 一次输入多个值的时候 Println 中间有空格
- Println 会自动换行,Print 不会
- Print:
- 一次输入多个值的时候 Print 没有 中间有空格
- Print 不会自动换行
- Printf
- Printf 是格式化输出,在很多场景下比 Println 更方便
Sprint
- 会把答应数据生成,并返回一个字符串
s2 := fmt.Sprintf("name:%s,age:%d", name, age)
time
时间大致有3种类型
- 时间对象
- 时间戳
- 格式化时间
- Add 用于时间相加
- Sub 用于两个时间求差值
- %02d 中的 2 表示宽度,如果整数不够 2 列就补上 0
- Equal
- 判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。
- 本方法和用t==u不同,这种方法还会比较地点和时区信息。
- Before
- 如果t代表的时间点在u之前,返回真;否则返回假。
- After
- 如果t代表的时间点在u之后,返回真;否则返回假。
- time.Tick 定时器
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时间的时间对象
now := time.Now()
fmt.Println(now)
// 格式化时间
strTime := now.Format("2006-01-02 15:04:05")
// 2006-01-02 15:04:05 必须是这个时间,go诞生的时间 记忆方法就是 2006 1 2 3 4 5
fmt.Println(strTime)
//可以将时间对象转换为时间戳
fmt.Println(now.Unix())
// 将字符串时间转换为golang中的时间对象
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(loc)
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/03/28 14:15:20", loc)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%T %v \n", timeObj, timeObj)
// Add方法,用于加时间的
// 1分钟前
m, _ := time.ParseDuration("-1m")
m1 := now.Add(m)
fmt.Println(m1)
// 1分钟后
mm, _ := time.ParseDuration("1m")
mm1 := now.Add(mm)
fmt.Println(mm1)
// Sub方法 用于求两个时间的饿差值
demoSub := mm1.Sub(m1)
fmt.Println(demoSub)
year := now.Year() //年
month := now.Month() //月
day := now.Day() //日
hour := now.Hour() //小时
minute := now.Minute() //分钟
second := now.Second() //秒
// 02d表示宽度,不够两位就补上0 比如9就是09
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
demoEqual := mm1.Equal(m1)
fmt.Println(demoEqual)
demoAfter := mm1.After(m1)
fmt.Println(demoAfter)
demoBefore := mm1.Before(m1)
fmt.Println(demoBefore)
}
// 定时任务
func tickDemo() {
ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
for i := range ticker {
fmt.Println(i) //每秒都会执行的任务
}
}
OS
操作系统执行命令的函数
参考
flag
实现了命令行解析参数,类似python的argparse
package main
import (
"flag"
"fmt"
"time"
)
func main() {
//定义命令行参数方式1
var name string
var age int
var married bool
var delay time.Duration
flag.StringVar(&name, "name", "张三", "姓名") // name就是变量名,张三就是默认值,姓名就是描述
flag.IntVar(&age, "age", 18, "年龄")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "d", 0, "延迟的时间间隔")
//解析命令行参数
flag.Parse()
fmt.Println(name, age, married, delay)
//返回命令行参数后的其他参数
fmt.Println(flag.Args())
//返回命令行参数后的其他参数个数
fmt.Println(flag.NArg())
//返回使用的命令行参数个数
fmt.Println(flag.NFlag())
}
// 查看帮助 go run main.go --help
encoding/json
- json和struct互相转换
- 序列化是指把结构体数据转化成 JSON 格式的字符串
- 反序列化是指把 JSON 数据转化成 Golang 中的结构体对象
- Golang 中 的 序 列 化 和 反 序 列 化 主 要 通 过 “encoding/json” 包 中 的 json.Marshal() 和 json.Unmarshal()方法实现
- tag可以用来映射struct中的key和json中的key
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
ID int `json:"id,string"`
// 加上 ,string 可以处理前端传过来的字符串格式的数据,添加string来告诉json包从字符串中解析相应字段的数据
Gender string `json:"gender"` // tag可以指定struct转换为json的时候的key
name string //私有属性不能被 json 包访问
Age int `json:"age"`
}
func structToJson() {
s1 := Student{
ID: 1,
Gender: "xxx",
name: "lalala", //小写字母开头的是私有属性,不能被json.Marshal 转换出来
Age: 18,
}
fmt.Printf("%#v \n", s1)
s, _ := json.Marshal(s1)
str := string(s)
fmt.Println(str)
fmt.Printf("%T", s1.ID)
}
func jsonToStruct() {
var s2 Student
str2 := `{"id":"1","gender":"男","Name":"李四","age":19}`
err := json.Unmarshal([]byte(str2), &s2)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%#v \n", s2)
}
func main() {
structToJson()
jsonToStruct()
}