Go 语言基础之常用包【flag、time、strconv、io】(2)

简介: Go 语言基础之常用包【flag、time、strconv、io】

Go 语言基础之常用包【flag、time、strconv、io】(1)https://developer.aliyun.com/article/1534276

3、strconv

Go 语言中 strconv 包实现了基本数据类型和其字符串表示的相互转换,主要有以下常用函数: Atoi()、Itoa()、parse系列、format系列、append系列。

3.1、string 转 int(Atoi)

       为什么是 Atoi 而不是 Atos 呢?这是因为C语言中没有string类型而是用字符数组(array)表示字符串。

func main() {
  str := "100"
  num, _ := strconv.Atoi(str)
  fmt.Printf("%T,%v", num, num) // int,100
}

3.2、int 转 string(Itoa)

func main() {
  num := 100
  str := strconv.Itoa(num)
  fmt.Printf("%T,%v", str, str) // string,100
}

3.3、Parse 系列

       Parse类函数用于转换字符串给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

  b, _ := strconv.ParseBool("true")
  f, _ := strconv.ParseFloat("3.1415", 64)
  i, _ := strconv.ParseInt("-2", 10, 64)
  u, _ := strconv.ParseUint("2", 10, 64)

3.4、Format 系列

Format系列函数实现了将给定类型数据格式化为string类型数据的功能。

s1 := strconv.FormatBool(true)
s2 := strconv.FormatFloat(3.1415, 'E', -1, 64)
s3 := strconv.FormatInt(-2, 16)
s4 := strconv.FormatUint(2, 16)

这里需要特别说明的是:

func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  • fmt 表示格式:‘f’(-ddd.dddd)、‘b’(-ddddp±ddd,指数为二进制)、’e’(-d.dddde±dd,十进制指数)、‘E’(-d.ddddE±dd,十进制指数)、‘g’(指数很大时用’e’格式,否则’f’格式)、‘G’(指数很大时用’E’格式,否则’f’格式)。
  • prec 控制精度(排除指数部分):对’f’、’e’、‘E’,它表示小数点后的数字个数;对’g’、‘G’,它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。

3.5、其它方法

func CanBackquote(s string) bool

表示返回字符串s是否可以不被修改的表示为一个单行的、没有空格和tab之外控制字符的反引号字符串。

4、文件操作

       计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件(音频、视频)等。

4.1、文件的打开与关闭

    // 返回文件对象指针和error对象
  file, _ := os.Open("./main.go")
  defer file.Close()

4.2、普通方式读取文件

读取文件的方法源码:

func (f *File) Read(b []byte) (n int, err error)

其中,b 是一个用于存放文件读取进来的字节,相当于是一个缓冲区,可以重复使用。

func main() {
  file, _ := os.Open("./main.go")
  defer file.Close()
 
  // 开辟一个大小为128的字节切片用来存储文件
  tmp := make([]byte, 128)
  n, err := file.Read(tmp)
  if err == io.EOF {
    fmt.Println("读取完毕")
    return
  }
  if err != nil {
    fmt.Println("读取失败")
    return
  }
  fmt.Printf("读取了%d字节的数据\n", n)
  fmt.Println(string(tmp[:n]))
}

       这种方式读取的缺点是我们并不能知道文件的大小,如果定义的缓冲区太大就浪费资源了,但是定义小了又读取不完整(因为只能读一次,不能循环利用),所以我们更多的是使用下面这种循环读取的方式:

func main() {
  file, _ := os.Open("./main.go")
  defer file.Close()
 
  var content []byte
  // 开辟一个大小为128的字节切片用来存储文件
  tmp := make([]byte, 128)
  for {
    n, err := file.Read(tmp)
    if err == io.EOF {
      fmt.Println("读取完毕")
      break
    }
    if err != nil {
      fmt.Println("读取失败")
      return
    }
    content = append(content, tmp[:n]...)
  }
  fmt.Println(string(content))
}

这种方法每次都会从文件读取 128 字节数据,Read 方法的返回值是一个切片,所以需要使用 append 函数来汇总到 content 切片当中;从下一次读取,又会把上一次的结果覆盖掉,

4.3、使用 bufio 读取文件

bufio 是在 file 的基础上封装了一层API,支持更多的功能:

func main() {
  file, _ := os.Open("./main.go")
  defer file.Close()
 
  scanner := bufio.NewScanner(file)
  for scanner.Scan() {
    fmt.Println(scanner.Text())
  }
  if err := scanner.Err(); err != nil {
    fmt.Println("读取失败", err)
  }
}

4.4、使用 os.ReadFile 读取整个文件

os包(go1.16之前是 io.ioutil )的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入:

func main() {
  content, err := os.ReadFile("./main.go")
  if err != nil {
    fmt.Println("读取失败")
    return
  }
  fmt.Println(string(content))
}

4.5、文件写入操作

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能:

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
  ...
}

其中 name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:

模式 含义
os.O_WRONLY  只写
os.O_CREATE 创建文件
os.O_RDONLY  只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加

4.5.1、Write 和 WriteString

func main() {
  // 0666是文件的权限设置,表示文件所有者、所属组和其他用户都有读写权限
  file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
  if err != nil {
    fmt.Println("操作文件失败", err)
    return
  }
  defer file.Close()
  str := "Hello let's Go\n"
  file.Write([]byte(str))
  file.WriteString("Hello Big Data")
}

运行结果:

4.5.2、bufio.NewWriter

效果都是一样的,只不过是不同包下的方法:

func main() {
  // 0666是文件的权限设置,表示文件所有者、所属组和其他用户都有读写权限
  file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
  if err != nil {
    fmt.Println("操作文件失败", err)
    return
  }
  defer file.Close()
  writer := bufio.NewWriter(file)
  for i := 0; i < 10; i++ {
    writer.WriteString("Hello let's Go\n") //将数据先写入缓存
  }
  writer.Flush() // 将缓存中的内容写入文件
}

4.5.3、os.WriteFile

       os 包(go1.16之前是 io.ioutil )下的 WriteFile 可以一次将一个byte切片内的数据全部写入文件当中。只不过不能指定写入模式,比如追加等。

func main() {
  str:="Hello let's Go"
  err := os.WriteFile("./test.txt", []byte(str), 0666)
  if err != nil {
    fmt.Println("写入失败")
    return
  }
}
相关文章
|
20天前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
63 4
|
20天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
73 1
|
2月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
258 1
|
2月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
305 0
|
2月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
206 0
|
2月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
171 0
|
2月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
267 0
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
2月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
262 0
|
2月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。

热门文章

最新文章