时间库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