Go语言学习草稿(8) 文件和时间

package mainimport ( "bufio" . "fmt" "io" "io/ioutil" "os" "path" "runtime" "time" )// 使用os包读取文件 func readFileUsingBaseMethod() { Println(os.Getwd()) // 获得当前工作目录 f, err := os.Open(`go-learn\pkg\calc.go`) if err != nil { Printf("打开文件失败, 原因是%v\n", err) return } defer f.Close() for true { // true可以省略 var tmp = [128]byte{} n, err := f.Read(tmp[:]) if err != nil { // 这种错误不会产生panic Printf("读取文件失败, 原因是%v\n", err) } Printf("读取了%d个字节\n", n) Println(string(tmp[:n])) if n < 128 { break } } }// 使用bufio读取文件 func readFileUsingBufIO() { f, err := os.Open(path.Join([]string{"go-learn", "pkg", "calc.go"}...)) // 后面3个点表示解包 if err != nil { Printf("打开文件失败, 原因是%v\n", err) return } defer f.Close() reader := bufio.NewReader(f) for { line, err := reader.ReadString('\n') // 读一行. 参数是分隔符 if err == io.EOF { Printf("读到结尾了") break } else if err != nil { Printf("读取一行失败, 原因是%v\n", err) } Print(line) } }// 使用ioutil读取文件 func readFileUsingIOUtil() { ret, err := ioutil.ReadFile(`go-learn\pkg\calc.go`) if err != nil { Printf("读取文件失败, 原因是%v\n", err) return } Println(string(ret)) }// 使用os包写入文件 func writeFileUsingBaseMethod() { // os.O_APPEND|os.O_CREATE|os.O_WRONLY 追加 新建 只写 // os.O_TRUNC|os.O_CREATE|os.O_WRONLY 从头开始写 f, err := os.OpenFile(`go-learn\bin\new.txt`, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { Printf("%v\n", err) } defer f.Close() f.Write([]byte("丑钝软")) f.WriteString("小王子\n") }// 使用bufio包写入文件 func writeFileUsingBufIO() { f, err := os.OpenFile(`go-learn\bin\new.txt`, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { Printf("%v\n", err) } defer f.Close() wr := bufio.NewWriter(f) wr.WriteString("小王子") // 写到缓存中 wr.Flush() }// 使用ioutil写入文件 func writeFileUsingIOUtil() { err := ioutil.WriteFile(`go-learn\bin\new.txt`, []byte("大汉"), 0666) if err != nil { Printf("写入文件失败, 原因是%v\n", err) return } }// 使用bufio从屏幕读取数据 func readConsoleUsingBufIO() { reader := bufio.NewReader(os.Stdin) s, _ := reader.ReadString('\n') // 参数是分隔符 Printf("输入的内容是:%s\n", s) }// 时间的各种方法 func timeTest() { // 获得当前时间 now := time.Now() // time.Time类型 Println(now) Println(now.Year()) Println(now.Month()) Println(now.Day()) Println(now.Hour()) Println(now.Minute()) Println(now.Second()) // 获得时间戳 timestamp := now.Unix() // 秒级时间戳 Println(timestamp) timestamp = now.UnixNano() // 纳秒级时间戳; 毫秒3位, 微秒3位, 纳秒3位 Println(timestamp) // 通过时间戳构建时间 before := time.Unix(int64(1564803667), 0) Println(before) // 时间间隔. 支持加 减 大于 小于 等于等多种操作 // Add是时间+间隔=>时间, Sub是时间-时间=>间隔 // 如果真的想时间-间隔, 就应该 时间.Add(-间隔) var d time.Duration = now.Sub(before) // 这里的Sub没有注意时区, 存在问题. 后面有一个正确的例子 Println(d) Println(now.Add(time.Hour)) // 时间格式化 // 用2006年1月2号下午3点4分5秒代替yyyy-m-d h:M:S // 下面的语句输出 2020/8/22 4:53:18.083 AM Println(now.Add(-12 * time.Hour).Format("2006/1/2 3:04:05.000 PM")) // 时间解析 t, err := time.Parse("2006/1/2 3:04:05.000 PM", `2020/8/22 4:53:18.083 PM`) if err != nil { Println("解析时间错误" + err.Error()) } else { Println(t) // 输出2020-08-22 16:53:18.083 +0000 UTC } // 按照时区解析时间, 然后做减法 loc, err := time.LoadLocation("Asia/Shanghai") if err != nil { Printf("load location failed, %v\n", err) } else { Println(loc) } t, err = time.ParseInLocation("2006-1-2 15:04:05", "2020-8-22 14:41:50", loc) Println(t) Println(now.Sub(t)) }func timerTest() { // 线程睡眠 time.Sleep(3 * time.Second) // 睡眠3秒 // 定时器 timer := time.Tick(time.Second) // Second是1秒的时间间隔 for t := range timer { Println(t) // 每隔1秒执行一次 } }func main() { // 获得运行堆栈 // Caller reports file and line number information about function invocations // on the calling goroutine's stack. The argument skip is the number of stack // frames to ascend, with 0 identifying the caller of Caller. (For historical // reasons the meaning of skip differs between Caller and Callers.) The return // values report the program counter, file name, and line number within the file // of the corresponding call. The boolean ok is false if it was not possible to // recover the information. pc, file, line, ok := runtime.Caller(0) // 0表示保留栈顶, n表示栈顶去掉n个栈顶 if !ok { Printf("runtime.Caller(1)失败\n") } Println(pc) Println(file) Println(line) // 输出 // 14054148 // F:/tmp/GOPATH/src/github.com/go-learn/chp1/main.go // 184 // 表明在main.go文件的184行调用了Caller }

    推荐阅读