文章目录
- 打印日志
- 系统调用命令
- json的序列化和反序列化
- base64
- 压缩和解压
- 标准输入
- 文件操作
- 目录操作
- init函数
- 包的可见性
- 数学库
- 生成随机数
- 时间函数
打印日志
package main
import (
"log"
"os"
)
func logger() {
log.Printf("%d\n", 5)//打印到控制台
fout, err := os.OpenFile("my.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm)//打开一个文件
if err != nil {
return
}
defer fout.Close()
//输出一条日志信息到文件中
logWriter := log.New(fout, "手动添加额外的信息", log.Ldate|log.Lmicroseconds)
logWriter.Printf("%s\n", "这是一条测试信息")
}
func main() {
logger()
}
系统调用命令
json的序列化和反序列化
type Student struct {
Name string
Age int
}
func main() {
stu := Student{"hjl", 18}
bs, _ := json.Marshal(stu)
fmt.Println(string(bs))
bs, _ = sonic.Marshal(stu)
fmt.Println(string(bs))
var stu1 Student
err := sonic.Unmarshal(bs, &stu1)
if err != nil {
fmt.Printf("错误\n")
return
}
fmt.Println(stu1.Name)
}
base64
压缩和解压
func compressDemo() error {
fin, err := os.Open("my.log")
if err != nil {
return err
}
defer fin.Close()
stat, _ := fin.Stat()
fmt.Printf("压缩前文件大小%d B\n", stat.Size())
//创建一个压缩文件
fout, err := os.OpenFile("my.zlib", os.O_CREATE|os.O_WRONLY, 0777)
if err != nil {
return err
}
defer fout.Close()
bs := make([]byte, 1024)
writer := zlib.NewWriter(fout)
//将文件中的内容写到压缩文件中
for {
n, err := fin.Read(bs)
if err == nil {
writer.Write(bs[:n])
} else {
if err == io.EOF {
break
} else {
fmt.Println(err)
break
}
}
}
writer.Close()
fin1, err := os.Open("my.zlib")
if err != nil {
return err
}
defer fin1.Close()
stat1, _ := fin.Stat()
fmt.Printf("压缩后文件大小%d B\n", stat1.Size())
reader, err := zlib.NewReader(fin1)
if err != nil {
return err
}
io.Copy(os.Stdout, reader)
reader.Close()
return nil
}
func main() {
compressDemo()
}
标准输入
文件操作
目录操作
func walk(path string) error {
if subFiles, err := ioutil.ReadDir(path); err != nil {
return err
} else {
for _, file := range subFiles {
fmt.Println(file.Name())
if file.IsDir() {
if err := walk(filepath.Join(path, file.Name())); err != nil {
return err
}
}
}
}
return nil
}
func main() {
walk(".")
}
init函数
只要引入了其他的包,就会在调用main函数之前自动调用这些包中的init函数。
所以init函数可以用来初始化这些包中的一些变量。
如果有多个包,其调用顺序如下:
包的可见性
数学库
生成随机数
如果想要生成真随机数,除了可以传入系统时间作为随机数种子以外:rand.Seed(time.Now().Unix())
。
还可以使用 crypto/rand 包中的方法,这样生成的每次都是不同的随机数:
func main() {
// 生成 10 个 [0, 128) 范围的真随机数。
for i := 0; i < 10; i++ {
result, _ := rand.Int(rand.Reader, big.NewInt(128))
fmt.Println(result)
}
}
时间函数
func main() {
layout := "2006x01x02 15a04a05"
now := time.Now() //拿到当前的时间
nowStr := now.Format(layout) //将当前的时间按照layout的格式转成字符串
fmt.Println(nowStr)
fmt.Println(now)
fmt.Println(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
<-time.After(3 * time.Second) //sleep三秒
//将字符串再转回时间类
loc, _ := time.LoadLocation("Asia/Shanghai")
fmt.Println(loc)
if t, err := time.ParseInLocation(layout, nowStr, loc); err == nil {
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
} else {
fmt.Println(err)
}
}