生活资讯
golang语言 、golang语言前景如何
2023-04-04 16:26  浏览:49

go语言的全称

Go全称Golang。

Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言”。

Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛。BAT大厂正在把Go作为新项目开发的首选语言。

golang是什么意思

Go语言(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。 扩展资料

Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的'增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。

Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。

Golang 语言深入理解:channel

本文是对 Gopher 2017 中一个非常好的 Talk�: [Understanding Channel](GopherCon 2017: Kavya Joshi - Understanding Channels) 的学习笔记,希望能够通过对 channel 的关键特性的理解,进一步掌握其用法细节以及 Golang 语言设计哲学的管窥蠡测。

channel 是可以让一个 goroutine 发送特定值到另一个 gouroutine 的通信机制。

原生的 channel 是没有缓存的(unbuffered channel),可以用于 goroutine 之间实现同步。

关闭后不能再写入,可以读取直到 channel 中再没有数据,并返回元素类型的零值。

gopl/ch3/netcat3

首先从 channel 是怎么被创建的开始:

在 heap 上分配一个 hchan 类型的对象,并将其初始化,然后返回一个指向这个 hchan 对象的指针。

理解了 channel 的数据结构实现,现在转到 channel 的两个最基本方法: sends 和 receivces ,看一下以上的特性是如何体现在 sends 和 receives 中的:

假设发送方先启动,执行 ch - task0 :

如此为 channel 带来了 goroutine-safe 的特性。

在这样的模型里, sender goroutine - channel - receiver goroutine 之间, hchan 是唯一的共享内存,而这个唯一的共享内存又通过 mutex 来确保 goroutine-safe ,所有在队列中的内容都只是副本。

这便是著名的 golang 并发原则的体现:

发送方 goroutine 会阻塞,暂停,并在收到 receive 后才恢复。

goroutine 是一种 用户态线程 , 由 Go runtime 创建并管理,而不是操作系统,比起操作系统线程来说,goroutine更加轻量。

Go runtime scheduler 负责将 goroutine 调度到操作系统线程上。

runtime scheduler 怎么将 goroutine 调度到操作系统线程上?

当阻塞发生时,一次 goroutine 上下文切换的全过程:

然而,被阻塞的 goroutine 怎么恢复过来?

阻塞发生时,调用 runtime sheduler 执行 gopark 之前,G1 会创建一个 sudog ,并将它存放在 hchan 的 sendq 中。 sudog 中便记录了即将被阻塞的 goroutine G1 ,以及它要发送的数据元素 task4 等等。

接收方 将通过这个 sudog 来恢复 G1

接收方 G2 接收数据, 并发出一个 receivce ,将 G1 置为 runnable :

同样的, 接收方 G2 会被阻塞,G2 会创建 sudoq ,存放在 recvq ,基本过程和发送方阻塞一样。

不同的是,发送方 G1如何恢复接收方 G2,这是一个非常神奇的实现。

理论上可以将 task 入队,然后恢复 G2, 但恢复 G2后,G2会做什么呢?

G2会将队列中的 task 复制出来,放到自己的 memory 中,基于这个思路,G1在这个时候,直接将 task 写到 G2的 stack memory 中!

这是违反常规的操作,理论上 goroutine 之间的 stack 是相互独立的,只有在运行时可以执行这样的操作。

这么做纯粹是出于性能优化的考虑,原来的步骤是:

优化后,相当于减少了 G2 获取锁并且执行 memcopy 的性能消耗。

channel 设计背后的思想可以理解为 simplicity 和 performance 之间权衡抉择,具体如下:

queue with a lock prefered to lock-free implementation:

比起完全 lock-free 的实现,使用锁的队列实现更简单,容易实现

golang是什么意思?

Go(又称Golang)是Google的Robert Griesemer,Rob Pike及Ken Thompson开发的一种静态强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC(垃圾回收),结构形态及CSP-style并发计算。

你为什么放弃golang?

因为内存管理粗糙。经常看到fmt.xxx导致内存占用太多,反射导致内存占用太多的抱怨。

go语言适合写服务器组件,那种和业务数据无关的服务器。比如数据库服务器、web服务器、日志搜索引擎等。如果用来写一个crm管理系统,非常累,因为缺乏好多高级特性和庞大的第三方库,而且语法比较单一,总体感觉就跟写命令行差不多。

Go语言是谷歌2009发布的编程语言,这个语言发明的目的,就是为了在运行速度接近C/C++语言的基础上(注意是接近),降低开发者的门槛,减少开发难度。

Go语言,在功能上没有超过C/C++,适用者为没有C/C++经验的开发者,开发出接近C效率的程序。对于已经熟练掌握C/C++的开发者来说,Go语言没有优势,还要重学语法,适应开发环境,明显是不符合效率的。

总结

其实语言这东西,都有其优势和劣势。而且有些东西并不是纯技术的。比如java的优势在于清晰的语意表达。写代码的上限不高,但是下限也不低,适合工业开发。

而go呢,不得不说go在微服务这块有先天优势。毕竟java中要实现go的很多功能,需要引入第三方库。很笨重。而go原生支持,这个微服务就很轻巧。但是go的语法太活,工业用是一个挺大的弊端。

golang语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于golang语言前景如何、golang语言的信息别忘了在本站进行查找喔。

发表评论
0评