On this page
article
3.Go常用库
Go常用基础库
时间库time
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Printf("原始时间对象:%s\n", now)
//格式化时间
timePrf := now.Format("2006-01-02 15:04:05")
fmt.Printf("格式化时间戳:%s\n", timePrf)
/*
output:
原始时间对象:2024-09-26 23:49:32.920331 +0800 CST m=+0.000064395
格式化时间戳:2024-09-26 23:49:32
*/
//时间戳
fmt.Printf("秒时间戳:%v\n", now.Unix())
fmt.Printf("毫秒时间戳:%v\n", now.UnixMilli())
fmt.Printf("微秒时间戳:%v\n", now.UnixMicro())
fmt.Printf("纳秒时间戳:%v\n", now.UnixNano())
/*
output:
秒时间戳:1727365772
毫秒时间戳:1727365772920
微秒时间戳:1727365772920331
纳秒时间戳:1727365772920331000
*/
//格式化后的时间(string)转时间对象
loc, _ := time.LoadLocation("Asia/Shanghai")
inLocation, _ := time.ParseInLocation("2006-01-02 15:04:05", timePrf, loc)
fmt.Printf("格式化后的时间字符串转时间对象:%s\n", inLocation)
/*
output:
格式化后的时间字符串转时间对象:2024-09-26 23:49:32 +0800 CST
*/
//获取年月日、时分秒
year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
fmt.Printf("获取年月日,时分秒:%d/%02d/%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
/*
output:
获取年月日,时分秒:2024/09/26 23:49:32
*/
//秒时间戳转时间类型,0代表指定这一秒内的偏移量以纳秒为单位
unixObj := time.Unix(now.Unix(), 0)
fmt.Printf("Unix时间戳转时间对象:%s\n", unixObj)
/*
output:
Unix时间戳转时间对象:2024-09-26 23:49:32 +0800 CST
*/
//时间计算
//add
fmt.Printf("当前时间:%s\n", now)
duration, _ := time.ParseDuration("1m")
addTime := now.Add(duration)
fmt.Printf("加计算后的时间:%s\n", addTime)
/*
output:
当前时间:2024-09-26 23:49:32.920331 +0800 CST m=+0.000064395
加计算后的时间:2024-09-26 23:50:32.920331 +0800 CST m=+60.000064395
*/
//sub
fmt.Printf("计算时间差:%s\n", now.Sub(addTime))
/*
output:
计算时间差:-1m0s
*/
}
os库
package main
import (
"fmt"
"os"
)
func main() {
/*
output:
*/
//获取当前目录
fmt.Println(os.Getwd())
/*
output:
/Volumes/data/go/src/test <nil>
*/
//cd到某个目录
dir, _ := os.Getwd()
os.Chdir("../")
fmt.Println(os.Getwd())
os.Chdir(dir)
/*
output:
/Volumes/data/go/src <nil>
*/
//创建文件夹
os.Mkdir("go_fly", 0777)
//删除文件夹
os.Remove("go_fly")
//修改文件名称
os.Mkdir("go_fly", 0777)
os.Rename("go_fly", "go_flyxx")
//创建文件
os.Create("./go_flyxx/feichi.txt")
//打开文件
file, _ := os.OpenFile("./go_flyxx/feichi.txt", os.O_RDWR|os.O_APPEND, 0666)
/*
O_RDONLY 打开只读文件
O_WRONLY 打开只写文件
O_RDWR 打开既可以读取又可以写入文件
O_APPEND 写入文件时将数据追加到文件尾部
O_CREATE 如果文件不存在,则创建一个新的文件
*/
file.WriteString("你好小飞")
}
文件操作
package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
//读文件数据
fileName := "file.txt"
file, _ := os.ReadFile(fileName)
fmt.Printf("读数据:%s\n", string(file))
/*
output:
读数据:你好👋
*/
//写数据
fileName2 := "hello.txt"
str1 := "虞锋是笨蛋"
_ = os.WriteFile(fileName2, []byte(str1), 0777)
//读取Reader类型的数据,常用于http response的读取
str2 := "虞锋是笨蛋吗?"
reader1 := strings.NewReader(str2)
allData, _ := io.ReadAll(reader1)
fmt.Printf("读取Reader类型的数据:%s\n", string(allData))
/*
output:
读取Reader类型的数据:虞锋是笨蛋吗?
*/
//读取当前目录下所有文件和文件夹,遍历一层
dir, _ := os.Getwd()
readDir, _ := os.ReadDir(dir)
fmt.Println("读取当前文件下所有文件或文件夹")
for index, mydir := range readDir {
fmt.Printf("第%v个:%s,是目录吗:%v\n", index, mydir.Name(), mydir.IsDir())
}
/*
output:
读取当前文件下所有文件或文件夹
第0个:.idea,是目录吗:true
第1个:file.txt,是目录吗:false
第2个:go.mod,是目录吗:false
第3个:go.sum,是目录吗:false
第4个:hello.txt,是目录吗:false
第5个:main.go,是目录吗:false
*/
}
flag包
package main
import (
"flag"
"fmt"
"time"
)
func main() {
//定义命令行参数
var (
name string
age int
marride bool
delay time.Duration
)
//传参:绑定的变量名,传参的参数名,传参的默认值,传参的备注
flag.StringVar(&name, "name", "张三", "姓名")
flag.IntVar(&age, "age", 18, "年龄")
flag.BoolVar(&marride, "marride", false, "婚否")
flag.DurationVar(&delay, "delay", 0, "延迟的间隔时间")
//解命令行参数
flag.Parse()
fmt.Println(name, age, marride, delay)
fmt.Printf("未解析的参数值:%s, 未解析的参数个数:%v, 使用的参数:%v\n", flag.Args(), flag.NArg(), flag.NFlag())
}
fei@feideMBP test % go run main.go -name feic -age 20 -marride=false -delay 1m a1 b1 c1
feic 20 false 1m0s
未解析的参数值:[a1 b1 c1], 未解析的参数个数:3, 使用的参数:4
实现hostnamectl命令
package main
import (
"flag"
"syscall"
)
func main() {
var hostname string
flag.StringVar(&hostname, "set-hostname", "feichi-server01", "主机名")
flag.Parse()
syscall.Sethostname([]byte(hostname))
}
fei@feideMBP test % CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
[root@yu123 ~]# ./hostname -h
Usage of ./hostname:
-set-hostname string
主机名 (default "feichi-server01")
[root@yu123 ~]# ./hostname -set-hostname yu1234
[root@yu123 ~]# bash
[root@yu1234 ~]# ./hostname
[root@yu1234 ~]# bash
[root@feichi-server01 ~]#
# 在mac版本的go中会没有这个方法:syscall.Sethostname,但是交叉编译成linux后可以运行:
https://github.com/golang/go/issues/46166