# 打印输出
import "fmt"
// Println 中间有空格 Print 没有
fmt.Println("go", "python", "php", "javascript") // go python php javascript
fmt.Print("go", "python", "php", "javascript") // gopythonphpjavascript
// Println 会自动换行,Print 不会
func main() {
fmt.Println("hello")
fmt.Println("world")
// hello
// world
fmt.Print("hello")
fmt.Print("world")
// helloworld
}
// Printf 是格式化输出
a := 10
b := 20
c := 30
fmt.Println("a=", a, ",b=", b, ",c=", c) // a= 10 ,b= 20 ,c= 30
fmt.Printf("a=%d,b=%d,c=%d", a, b, c) // a=10,b=20,c=30
# 时间处理
- 当前时间
now := time.Now() // 获取当前时间
fmt.Printf("当前时间:%v\n", now)
fmt.Printf("年:%v\n", now.Year())
fmt.Printf("月:%v\n", now.Month())
fmt.Printf("日:%v\n", now.Day())
fmt.Printf("时:%v\n", now.Hour())
fmt.Printf("分:%02d\n", now.Minute())
fmt.Printf("秒:%02d\n", now.Second())
fmt.Printf("星期:%v\n", now.Weekday())
fmt.Printf("纳秒:%v\n", now.Nanosecond())
fmt.Printf("时间戳:%v\n", now.Unix())
- Format 方法格式化输出日期字符串
now := time.Now()
// 格式化的模板为 Go 的出生时间 2006 年 1 月 2 号 15 点 04 分Mon Jan
// 24 小时制
fmt.Println(now.Format("2006-01-02 15:04:05"))
// 12 小时制
fmt.Println(now.Format("2006-01-02 03:04:05"))
fmt.Println(now.Format("2006/01/02 15:04"))
fmt.Println(now.Format("15:04 2006/01/02"))
fmt.Println(now.Format("2006/01/02"))
- 时间戳转换为日期字符串
func unixToTime1(timestamp int64) {
timeObj := time.Unix(timestamp, 0) // 将时间戳转为时间格式
year := timeObj.Year() // 年
month := timeObj.Month() // 月
day := timeObj.Day() // 日
hour := timeObj.Hour() // 小时
minute := timeObj.Minute() // 分钟
second := timeObj.Second() // 秒
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
func unixToTime2(timestamp int64) {
timeObj := time.Unix(timestamp, 0) // 将时间戳转为时间格式
fmt.Println(t.Format("2006-01-02 03:04:05")) // 日期格式化输出
}
func main() {
unixToTime1(1587880013)
unixToTime2(1587880013)
}
- 日期字符串转换成时间戳
t1 := "2019-01-08 13:50:30"
timeTemplate := "2006-01-02 15:04:05" // 常规类型
stamp, _ := time.ParseInLocation(timeTemplate , t1, time.Local)
fmt.Println(stamp.Unix())
- 时间操作函数
now := time.Now()
later := now.Add(time.Hour) // 当前时间加 1 小时后的时间
fmt.Println("1小时后的时间:", later)
difference := later.Sub(now)
fmt.Println("时间差:", difference.Hours())
later.Before(now) // 判断 later 是否在 now 之前
fmt.Println("later 是否在 now 之前:", later.Before(now))
- 定时器
// 使用 time.NewTicker(时间间隔)来设置定时器
ticker := time.NewTicker(time.Second) //定义一个 1 秒间隔的定时器
n := 0
for i := range ticker.C {
fmt.Println(i) //每秒都会执行的任务
n++
if n > 5 {
ticker.Stop()
return
}
}
// time.Sleep(time.Second) 来实现定时器
for {
time.Sleep(time.Second)
fmt.Println("我在定时执行任务")
}
# 文件操作
# 文件基本操作
- 打开和关闭文件
// os.Open()以只读方式打开一个文件,返回一个*File 和一个 err
// 操作完成文件对象以后一定要记得关闭文件
file, err := os.Open("./go.mod")
if err != nil {
fmt.Println("open file failed!, err:", err)
return
}
fmt.Println(file) // &{0xc000078780}
// 为了防止文件忘记关闭,我们通常使用 defer 注册文件关闭语句
defer file.Close()
- 创建并写入文件
// 直接写入全部内容(会覆盖原有内容)
data := []byte("Hello, Go!\n第二行内容")
err := os.WriteFile("example.txt", data, 0644)
if err != nil {
panic(err)
}
// 以追加模式打开并写入
f, err := os.OpenFile("example.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
defer f.Close()
_, err = f.WriteString("\n追加一行")
if err != nil {
panic(err)
}
- 读取文件
// 一次性读取整个文件
content, err := os.ReadFile("example.txt")
if err != nil {
panic(err)
}
fmt.Println(string(content))
// 按行读取(使用 bufio)
f, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
fmt.Println("行:", scanner.Text())
}
if err := scanner.Err(); err != nil {
panic(err)
}
- 删除文件
err := os.Remove("example.txt")
if err != nil {
panic(err)
}
- 重命名
err := os.Rename("old.txt", "new.txt")
if err != nil {
panic(err)
}
# 目录操作
- 创建目录
// 创建单层目录
err := os.Mkdir("mydir", 0755)
if err != nil {
panic(err)
}
// 创建多层目录
err = os.MkdirAll("path/to/deep/dir", 0755)
if err != nil {
panic(err)
}
- 删除目录
// 删除空目录
err := os.Remove("mydir")
if err != nil {
panic(err)
}
// 递归删除整个目录树
err = os.RemoveAll("path/to/deep")
if err != nil {
panic(err)
}
- 读取目录内容
entries, err := os.ReadDir(".")
if err != nil {
panic(err)
}
for _, entry := range entries {
fmt.Printf("名称: %s, 是否目录: %v\n", entry.Name(), entry.IsDir())
// 如需获取详细信息,可调用 entry.Info()
info, _ := entry.Info()
fmt.Printf(" 大小: %d, 修改时间: %v\n", info.Size(), info.ModTime())
}
- 遍历目录树(递归)
err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
fmt.Printf("路径: %s, 是否为目录: %v\n", path, d.IsDir())
return nil
})
if err != nil {
panic(err)
}
# 路径操作
- 路径拼接、拆分
// 平台无关的路径拼接
fullPath := filepath.Join("dir", "subdir", "file.txt")
fmt.Println(fullPath) // 输出: dir/subdir/file.txt (Windows 下为 dir\subdir\file.txt)
// 获取目录和文件名
dir, file := filepath.Split("dir/subdir/file.txt")
fmt.Printf("目录: %q, 文件: %q\n", dir, file) // 目录: "dir/subdir/", 文件: "file.txt"
// 获取绝对路径
abs, err := filepath.Abs(".")
if err != nil {
panic(err)
}
fmt.Println("绝对路径:", abs)
- 检查路径是否存在
func pathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
← 基础知识