it177模板网(www.it177.com)精品网站源码,织梦建站模版,游戏源代码分享平台

模板户源码

当前位置:首页 -> 下载中心 -> 软件工具 正文

Go语言学习心得

时间:2019-03-10 11:00:41 [整站源码]作者:zhaopulei


SEATELL海说软件


-海说软件接受各种技术咨询及开发业务-





       17年接触 golang,虽然早就听说 golang 并发能力强、跨平台无虚拟机、自动 GC、快速编译等特点,但实际去练习和使用它却没有多长时间。虽然如此,感觉还是学到了点东西。


记得最早对 golang 印象还在上大学, 那时 golang 给我的印象是好像类似 lua,整个程序就只有一个线程,想要并发得靠协程间来回切换,因为当时还不够懂异步 IO,所以感觉这还不如用线程、线程池,而 lua 那种协程没发并行计算,是 1个线程对应 N 个协程,如果一个协程有个死循环整个线程会卡住,其他协程就不能执行了,因此产生了对 golang 的误解。


后来学习 nodejs 了解到了异步 IO,再后来又去看了协程异步 IO 库 state-threads 的机制,最后阅读了 golang 底层实现的相关资料,才解开了之前的误解并清楚的认知到这种并发方式的高效,M 个线程对应 N 个协程加上异步 IO 并依靠调度器,的确能提供很高的并发效率。不过虽然底层是异步 IO,但 golang 通过调度器让用户层还是原来阻塞式的写法,相对于如 libev,libuv 这类的回调函数式风格的异步 IO 框架, 较符合人们的编程习惯,提高了性能又不失开发效率。

  

接下来介绍下这门语言的一些特点:


1、内建的并发原语


Golang 在语言层面对并发编程提供支持,一种类似协程,称作 goroutine 的东东,只需在函数调用语句前添加 go 关键字,就可创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。  

goroutine 是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务。另有与之配套的 chan 类型,用以实现 "以通讯来共享内存" 的 CSP 模式,廉价的 goroutine 可以让我们美滋滋地处理异步任务,chan 可以用来交换数据, 这些简化了原本复杂的并发开发方式。

例子:

var channel chan int = make(chan int)
 func asyncIO(){
  
fmt.Println("aab")
  
channel<-666
 
}
 
func mian(){
  
go asyncIO()
  
fmt.Println("main")
  
fmt.Println(<-channel)
 }

 

输出:

main

aab

666


2、没有类和继承


 Go语言没有类和继承的概念,取而代之的是 struct、interface 和方法,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性,interface 的特性是 golang 支持鸭子类型的基础,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。凭借接口机制和鸭子类型,golang 提供了一种游离于类、继承、模板之外的另一种可靠的选择。


例子:

type Duck interface {
  
cry()
  
walk()
 }
 
type Goose struct {
 }

 
func (g Goose) cry() {
  
fmt.Println("嘎嘎嘎")
 }
 
func (g Goose) walk() {
  
fmt.Println("< < < <")
 }

 
type Actors struct {
 }

 
func (a Actors) cry() {
  
fmt.Println("嘎 嘎 嘎")
 }
 
func (a Actors) walk() {
  
fmt.Println("< <  < <")
 }

 
func main() {
  
var duck Duck
  
duck = new(Goose)
  
duck.cry()
  
duck.walk()
  
duck = new(Actors)
  
duck.cry()
  
duck.walk()
 }

 

输出:

嘎嘎嘎

< << <

嘎 嘎 嘎

<<  < <


3、不用trycatch来处理异常


  Java、javascript 这类是通过 try 块来包裹住会抛出异常的代码,catch 块来处理捕获的错误,而 go 语言就不一样了,是通过 panic 函数来抛出,而捕获则需要 defer +  recover, 不过这个 defer 不是 block 级别的,而是函数级别的,需要在函数返回前才得到执行。怎么说呢,这种机制不同于以上两种语言,各有各的特点,不过 golang 的就和 nodejs 以前的异步操作的回调函数一样,错误处理比较繁琐,需要对很多 err 进行判断。


例子:

func error1(){
  
defer func(){
     
if err:=recover; err!=nil{
        
fmt.Println(err)
      }
   }()
  
panic("aab")
  
fmt.Println("hihihi")
 }
 
func main(){
  
error1()
  
fmt.Println("main")
 }

 

输出:

aab

main


以上就是 golang 感觉比较有特点的地方。总的来说呢,golang 是比较容易上手,学习曲线也比较低,最好是有 c 或 c++ 基础,因为 golang 里面有指针之类的东西,有前两个的基础理解较为方便。还有对于运维来说,Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得很方便,不需要操心应用所需的各种包、库的依赖关系,减轻了维护的负担。


当然 golang 也有一些不足之处,不过自己只拿来写过的练手 web 服务不便谈论,golang 其他优秀的、好玩的特性,因为篇幅限制,就不一一阐述了,欢迎大家转发、点赞、评论,谢谢。


海说软件会持续推出前端教学课程、技术干货。

往期课程:

前端知识 | 浅谈懒加载,瀑布流和木桶布局

微信支付那些事儿

前端知识 | 浅谈在React中使用echarts

微信小程序已成为企业发展的必要途径?

前端知识 | 简析ES6

企业如何选择合适的编程语言?

前端知识 | React Native手势响应浅析

该拿什么拯救,触目惊心的猝死和自杀列表背后的创业圈!

前端知识 | CSS小技巧-自适应椭圆

前端知识 | Flexbox布局模式

React Native 基于画板简析封装安卓原生UI

前端知识 | Redux的使用

前端知识 | React Native Animated动画浅谈

前端知识 | React-Router路由系统

前端知识 | React-Native 组件生命周期

React | 使用webpack构建React项目

React | 高效前端之浅谈



-END- 

    阅读原文

    发送中

    阅读原文

    本文标签:AutoTags插件服务端需要您提供购买者的账号和密码才能继续访问  折翼天使  莎莎源码  吾爱源码  其他源码 

    转载请注明来源:PHP手机端发卡多种支付商业版源码

    本文永久链接地址:https://www.suibianlu.com/11942.html

    郑重声明:
    本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
    若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
    如无法链接失效或侵犯版权,请给我们来信:admin@suibianlu.com

    栏目导航
    最新文章
    热门文章
    Top