107.【并发与标准库】(八)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 107.【并发与标准库】
  1. ReadFile

读取文件

package main
import (
  "fmt"
  "io/ioutil"
  "log"
)
func main() {
  content, err := ioutil.ReadFile("test.txt")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Printf("File contents: %s", content)
}

WriteFile

写文件

package main
import (
  "io/ioutil"
  "log"
)
func main() {
  message := []byte("Hello, Gophers!")
  err := ioutil.WriteFile("hello", message, 0644)
  if err != nil {
    log.Fatal(err)
  }
}

8.标准库bufio包之读

(1).bufio的基础介绍

bufio包实现了有缓冲的I/O。它包装一个io.Readerio.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。

(2).bufio实列读取
  1. bufio.NerReader()放入缓冲区 -默认4096
package main
import (
  "bufio"
  "fmt"
  "strings"
)
func main() {
  reader := strings.NewReader("hello world") // 创建一个只能读的对象
  reader2 := bufio.NewReader(reader) // 利用bufio存放读的数据对象
  readString, _ := reader2.ReadString('\n') // 读出数据
  fmt.Printf("%v\n", readString)
}

2.bufio.NerReaderSize() 设置缓冲区大小

package main
import (
  "bufio"
  "fmt"
  "strings"
)
func main() {
  reader := strings.NewReader("hello world") // 创建一个只能读的对象
  reader2 := bufio.NewReaderSize(reader, 10) // 利用bufio存放读的数据对象
  readString, _ := reader2.ReadString('\n') // 读出数据
  fmt.Printf("%v\n", readString)
}

9.标准库bufio之写

(1).bufio.writer()

写完之后,我们要刷新缓存

https://pkg.go.dev/std

package main
import (
  "bufio"
  "os"
)
func main() {
  file, _ := os.OpenFile("test.txt", os.O_RDWR|os.O_APPEND, 777)
  writer := bufio.NewWriter(file)
  writer.WriteString("哈哈哈哈")
  writer.Flush() // 一定要刷新一下缓冲区
  defer file.Close()
}

10.标准库bufio之Scanner

(1). bufio.Scanner() 扫描
package main
import (
  "bufio"
  "fmt"
  "strings"
)
func main() {
  reader := strings.NewReader("ABC DEF GHI JKL")
  scanner := bufio.NewScanner(reader)
  scanner.Split(bufio.ScanWords) // 以空格输出
  for scanner.Scan() {           // 假如说扫描不到值就返回false
    fmt.Printf("%v", scanner.Text())
  }
}

11.标准库log包

(1).介绍

golang内置了 log 包,实现简单的日志服务。通过调用 log 包的函数,可以实现简单的日志打印功能。

log使用

log包有三个系列的日志打印函数,分别是print系列、panic系列、fatal系列。

  1. print : 单纯打印日志
  2. panic: 打印日志,抛出panic异常
  3. fatal: 打印/日志,强制结束程序(os.exit),defer函数不会执行。
(2).print 日志打印
package main
import "log"
func main() {
  log.Println("你好") //打印日志
  log.Printf("my log %d->", 100)
}

(3).panic 日志打印

就是在panic这个输出语句 输出之后,就会抛出异常。后面得语句就不会生效。除非定义在panic得方法和defer方法

package main
import "log"
func main() {
  defer println("11111111")
  log.Panicln("sdsd") //执行完这个语句之后,就抛出异常。后面的所有代码就失效了。
  println("sdsd")
}

(4).fatal 日志打印
package main
import "log"
func main() {
  defer println("11111111")  //不会被打印 直接中断
  log.Fatal("222222")
  println("3333333")
}

(5).进行设置日志配置
log.SetOutput(file)  //********日志配置**** 输出在这个文件中
package main
import (
  "log"
  "os"
)
func main() {
  // log.Llongfile  ->指出绝对路径
  // log.Lshortfile -> 指出文件的位置
  log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) // 日期和时间和文件的位置
  log.SetPrefix("jsxs: ")                              // 前缀
  file, err := os.OpenFile("test.txt", os.O_WRONLY|os.O_APPEND, 775)
  if err != nil {
    log.Println("文件有误")
  }
  log.SetOutput(file)  //********日志配置**** 输出在这个文件中
  log.Println("mylog...\n")
}

(6).自定义logge

log 包为我们提供了内置函数,让我们能够自定义logger。从效果上来看,就是将标题3中的标准配置日志、日之前缀配置、日志输出位置整合到一个函数中,使日志配置不在那么繁琐。

log 包中提供了 func New(out io.Writer, prefix string, flag int) *loger函数来实现定义logger

package main
import (
  "log"
  "os"
)
func main() {
  file, err := os.OpenFile("test.txt", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 775)
  if err != nil {
    log.Println("文件有误")
  }
  logger := log.New(file, "MyLog:", log.Ltime|log.Ldate|log.Lshortfile)  // 设置格式
  logger.Println("112121212122")
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
12月前
|
缓存 Go C语言
107.【并发与标准库】(七)
107.【并发与标准库】
45 0
|
12月前
|
缓存 Go
107.【并发与标准库】(二)
107.【并发与标准库】
38 0
|
4月前
|
数据采集 数据库 C++
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
46 0
|
12月前
|
缓存 索引
107.【并发与标准库】(九)
107.【并发与标准库】
32 0
|
10月前
|
编译器 Linux 调度
|
15天前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
2月前
|
数据采集 算法 数据处理
Python中的并发编程:异步IO与多线程对比分析
传统的多线程编程在Python中因为全局解释器锁(GIL)的存在受到限制,导致多线程并不能充分利用多核处理器的优势。本文将探讨Python中的异步IO编程与多线程编程的差异与优劣,并分析适合的应用场景。
|
3月前
|
并行计算 API Python
Python中的并发编程(1)并发相关概念
Python中的并发编程(1)并发相关概念
|
4月前
|
消息中间件 程序员 调度
Python并发编程:利用多线程提升程序性能
本文探讨了Python中的并发编程技术,重点介绍了如何利用多线程提升程序性能。通过分析多线程的原理和实现方式,以及线程间的通信和同步方法,读者可以了解如何在Python中编写高效的并发程序,提升程序的执行效率和响应速度。