【Go语言快速上手(五)】文件操作&协程操作

慈云数据 2024-05-28 技术支持 55 0

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Go语言专栏⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多Go语言知识

  🔝🔝


在这里插入图片描述

GO快速上手

  • 1. 前言
  • 2. GO语言的文件操作
  • 2. 初识协程
  • 3. 协程的等待问题
  • 4. 协程的资源竞争问题
  • 5. 总结以及拓展

    1. 前言

    本篇文章将会将GO语言的一大杀器,那就是协程. 为啥很多大厂都在慢慢的转GO.看完这篇文章你可能会有所感悟

    本章重点:

    本篇文章会讲解GO语言中如何读写/创建文件,也就是我们所谓的IO流的用法. 然后, 会讲解协程的基本概念和GO语言中是如何操控协程的, 在协程的讲解中会穿插资源竞争下的锁问题,会讲解互斥锁和读写锁在GO语言中是如何使用的. 最后会给大家讲解GO语言中的特殊的类型: channel管道


    2. GO语言的文件操作

    这里就不多叙述什么是IO操作了,毕竟本系列的文章不是0基础. 首先最经典的IO操作函数,open和close:

    在这里插入图片描述

    在这里插入图片描述

    请注意, open是函数,而close是方法,他们的用法是不同的,并且,open函数位于os包下,使用前记得import包进去. 除此之外,打开文件后不能直接读取内容,需要创建一个流,这个流你可以理解为是一条管道,连接被打开的文件和程序, 利用这条管道来读取文件中的数据

    package main
    import (
    	"bufio"
    	"fmt"
    	"os"
    )
    func main() {
    	//打开文件
    	 f, err := os.Open("test.txt")
    	if err != nil{
    		fmt.Println("打开文件失败
    	}
    	defer f.close() //函数执行完后关闭
    	//创建一个流)
    	reader := bufio.NewReader(f)
    	//读取操作
    	for{
    		//以回车作为标识符,遇见\n后就是一次读取
    		str.err := reader.ReadString("\n")
    		if err!=io.EOF{
    			break
    		}
    		fmt.Println(str)
    	}
    }
    

    其实你对操作系统有一点理解的话,你应该能猜出来,所谓的GO语言的open,close,,newreader函数,无非就是封装了内几个系统调用

    还有一种写法可以不用使用open和close就能读取/写入文件:

    context,err := ioutil.ReadFile("文件路径")//返回值是[]byte,err
    if err != nil{
    	fmt.Println("读取出错",err)
    }
    fmt.Printf("%v",string(context))//将[]byte转换为string输出
    

    还有一种打开文件的方法:

    在这里插入图片描述

    在这里插入图片描述

    这和Linux下调用系统调用打开文件时,设置权限类似:

    writer, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0)
    	defer writer.Close()
    	if err != nil {
    		fmt.Println("openfile err")
    		return
    	}
    	//一个流对应到一个文件上(管道)
    	writefile := bufio.NewWriter(writer)
    	//只是将数据写入了缓冲区,而还没有刷新到文件中
    	writefile.WriteString("\nneokou will be the best")
    	writefile.Flush()
    

    2. 初识协程

    在学习线程时,理解线程是轻量级的进程,使用多个线程完成不同的任务带来的损耗远比全部使用进程要少. 虽然线程已经够优秀了,但是进行上下文切换也会浪费很多时间, 于是引入了协程的概念, 协程可以理解为是微线程, 协程不像进程和线程一样需要进行上下文的切换, 协程的上下文切换由开发人员决定. 多的概念不说,GPT一搜遍地都是.总之协程是用来替代线程去完成高并发任务的

    在这里插入图片描述

    话不多说,直接上案例:

    func Routine(){
    	for i:=0;i
    		fmt.Println("hello routine")
    		//阻塞一秒
    		time.Sleep(time.Second*1)
    	}
    	func main(){
    	go routine()
    	for i:=0;i
    		fmt.Println("hello main")
    		time.Sleep(time.Second*1)
    	}
    }
    
    	defer wg.Done() //函数执行完后,计数器减一
    	for i := 0; i 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon