一篇给大家介绍Go语言基础知识的文章。易于部署,不需要容器,运行任何一个都等同于Nginx的存在。怎么可能不受欢迎呢?那么,一起来看看吧!!!简介Go语言,一门专门为并发而生的语言,每次启动都会创建一个微线程,成本大约2KB起步。假设一个内存条的大小是4G,一个微线程是2kb。1G=1024M=1048576kb,1048576/2=524288,五十多万。但是你知道在Java、Python这样的语言中一个线程的开销是多少吗???,2MB起步,成本直接翻了一千倍So,激动一下,直接用Go写一个web程序,基本相当于NginxgoroutineGo中的微线程,也叫goroutine,goroutine是并行处理任务,就像我用两只手同时操作两部手机,就相当于玩游戏,而不是一只手玩一只手,另一只手玩另一只手。这样切换游戏的goroutine就被Go运行时调度了。goroutine的本质是在代码(用户态)层面完成的切换,成本很小。Java、Python等语言的线程都是在操作系统(内核态)层面完成的切花,所以成本非常高,因为goroutine是runtime切换的,而且runtime已经谷歌数字优化过了老板。小母牛上山了,厉害了。使用goroutine在Go中使用goroutine非常简单。你只需要在你要调用的函数前加一个go,也就是启动一个goroutine。println("I'mtalkingfor1sandfinished...")}mainfuncmain(){//开始时间varstart_time=time.Now()//开始10个saywordsfori:=0;i<10;i++{say()}//结束时间varend_time=time.Now()//计算时间差fmt.Println(end_time.Sub(start_time))}执行结果循环了10次,耗时10s,有点慢!goroutine调用函数函数还是上面的函数mainfuncmain(){//开始时间varstart_time=time.Now()//开始10saywordsfori:=0;i<10;i++{goSay()}//结束时间varend_time=时间。Now()//计算时间差fmt.Println(end_time.Sub(start_time))}注意:第6行前面加了一个go关键字,go关键字的意思是在微线程中单独运行这个函数.执行结果是什么???0s,什么情况?为什么会出现0?这是因为,在Go中,我们使用了守护线程的方法。这是什么意思?在Go中,只要执行了main函数,其他的Microthreads肯定就爽了。就像一些魔物一样,它们相互依赖着一个母体,母体死了,下面的婴儿也会死去。那么如何解决这个问题???sync.WaitGroup上面提到,我们发现有些微线程启动了,但是微线程还没来得及执行就挂了,原因是main函数跑得太快了。主运行后,Go运行自动关闭其他微线程。然后反过来想想,怎么才能让mainwait在最后,等我孩子回来了,我再继续跑。于是,又出现了一个新的问题,那就是等待,祭出法宝sync。WaitGroup先看函数funcSay(){//函数末尾unmark的用法deferwg.Done()//添加eachfunctionatstartupAmarkwg.Add(1)//函数开始标记一个marktime.Sleep(time.Second*1)fmt.Println("I'mtalkingfor1sandfinished...")}mainvarwgsync.WaitGroupfuncmain(){//开始时间varstart_time=time.Now()//开始10个saywordsfori:=0;i<10;i++{goSay()}//等待所有标记的微线程执行完毕wg.Wait()//结束时间varend_time=time.Now()//计算时间差fmt.Println(end_time.Sub(start_time))}执行结果可以看到,10个线程同时启动,1s是over,而且代码比较简单,即使开启10wFirst,也还是1s多一点,这也是很多公司越来越青睐Go的原因。runtime.GOMAXPROCS表示使用多少核,默认使用所有核,性能满分,但也有意想不到的情况,比如一台机器跑了很多其他任务。这不是Go写的重要任务,而是一种计算类型。是的,这个时候,理论上是不可能尽可能的跑在别人的算力上,所以需要限制当前程序使用的电脑的算力。代码funcmain(){//本机CPU个数varcpuNum=runtime.cpuNum)//设置Go运行时使用的cpu数.GOMAXPROCS(4)}综上所述,我们学习了Go的并发以及如何创建协程(goroutine)。为什么需要sync.WaitGroup。设置当前程序使用的CPU核数。在Go中,想要轻松实现高并发是相当容易的,但可能就没那么容易理解了。
